Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что есть конструктор? (https://javascript.ru/forum/misc/29718-chto-est-konstruktor.html)

imissyouso 08.07.2012 18:31

Что есть конструктор?
 
Начал изучать javascript. Прочитал много статей по основам ООП, после моего классического понимания ООП в jav'e или php в голове появилась путаница.
Сначала опишу как я понял то что прочитал, а потом задав вопрос. (поправьте если понял не правильно)

объект можно создавать 2умя основными способами: через функцию-конструктор и через языковой литерал (var a = {}).
Функция конструктор позволяет создать объект по шаблону который описан в её реализации оперируя со ссылкой this. this наследует свойства и методы объекта ссылка на который указана в свойстве prototype конструктора.
вот есть такой код:

function Child(){}
function Parent()
{
    this.name = "Vasia"; 
}

var parent = new Parent();
//тут я указываю свойству конструтора prototype ссылку на объект parent
Child.prototype = parent;

var child = new Child();

alert(child.name);

Ну вот понятно что child и parent имеют право иметь свойства и методы (например name), потому что это ОБЪЕКТЫ.
Но как может быть свойство у функции? У конструктора Child?? Это же не объект. На данный момент я понимаю что да, этот код работает. Но по какой такой логике мы НЕ объекту указываем свойство(в данном случае св-во prototype для НЕ объекта Child). Как это работает на более нижнем уровне, на уровне интерпретатора языка? Вот что интересно, столько статей, а про это нет ни слова.

nerv_ 08.07.2012 19:00

Цитата:

Сообщение от imissyouso
объект можно создавать 2умя основными способами: через функцию-конструктор и через языковой литерал (var a = {}).

литерал подразумевает вызов функции конструктора Object()

Цитата:

Сообщение от imissyouso
Но как может быть свойство у функции?

может

Цитата:

Сообщение от imissyouso
Это же не объект

объект

Цитата:

Сообщение от imissyouso
Вот что интересно, столько статей, а про это нет ни слова.

неправда

imissyouso 08.07.2012 19:07

я считал что объекты создаются при помощи new с указанием класса(в данном языке - конструктора). Так каким же объектом является функция? Она же просто объявляется.
to nerv: если не можешь ответить нормально, а только односложными обрывками - лучше промолчи. Какой был в твоём посте смысл.

nerv_ 08.07.2012 19:20

imissyouso, вообще, название темы - Что есть конструктор?. Конструктор - это функция.

http://shamansir.github.com/JavaScript-Garden/#function

Фленаган:
Цитата:

Важной чертой JavaScript является то, что функции представляют собой значения, которыми можно манипулировать в JavaScript-коде. Во многих языках, в том числе в Java, функции – это всего лишь синтаксические элементы языка, но не тип данных: их можно определять и вызывать. То обстоятельство, что функции в JavaScript представляют собой настоящие значения, придает языку большую гибкость. Это означает, что функции могут храниться в переменных, массивах
и объектах, а также передаваться в качестве аргументов другим функциям. Очень часто это бывает очень удобно.
Вопрос: какие доки ты "куришь"?

на закуску

Цитата:

Сообщение от imissyouso
Она же просто объявляется.

ты невнимателно читал. В js существуют две "разновидности" функций:
1. функции объявления
2. функции выражения
http://learn.javascript.ru/function-...ion-expression
http://shamansir.github.com/JavaScri...nction.general

imissyouso 08.07.2012 19:25

то есть здесь это такой тип данных?
и написав function Child(){}
интерпретатор создаст объект типа Function с именем Child который будет иметь поле prototype? Потом этот объект можно исползовать как конструктор используя совместно с оператором new?

imissyouso 08.07.2012 19:28

Во! оно! Спасибо большое, действительно, читал да не то. Извиняюсь за карму, верну

nerv_ 08.07.2012 19:38

Цитата:

Сообщение от imissyouso
то есть здесь это такой тип данных?

так говорит typeof
function F() {}
alert( typeof F );

Цитата:

Сообщение от imissyouso
интерпретатор создаст объект типа Function с именем Child который будет иметь поле prototype?

и не только его
Цитата:

Сообщение от imissyouso
Потом этот объект можно исползовать как конструктор используя совместно с оператором new?

да. Любую функцию можно использовать как конструктор или метод. И this - не тоже, что в других языках программирования. Короче, фишек много )

Цитата:

Сообщение от imissyouso
Извиняюсь за карму

фиг с ней )

oneguy 09.07.2012 02:15

Цитата:

Сообщение от nerv_
В js существуют две "разновидности" функций:
1. функции объявления
2. функции выражения

Не совсем так. То, что вы написали является разновидностями объявлений функций, но не самих функций.

B@rmaley.e><e 09.07.2012 06:55

Цитата:

Сообщение от imissyouso
я считал что объекты создаются при помощи new с указанием класса(в данном языке - конструктора). Так каким же объектом является функция?

fnc = new Function('a', 'alert(a)');
fnc("Hello");
Цитата:

Сообщение от imissyouso
то есть здесь это такой тип данных?

Функция высшего порядка


Часовой пояс GMT +3, время: 06:18.