Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О свойствах и методах в объектах и прототипах 
V
    Опции темы
Burrr
Дата 29.4.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



Приветствую!

Речь пойдет о статье ООП в Java Script (2): Классы, размещенной на karaboz.ru.

Процитирую комментарий, оставленный пользователем Zeroglif:
Цитата
> При вызове свойства объекта, оно ищется сначала в самом объекте, и если его там не оказывается, то интепретатор смотрит в .prototype функции-конструктора, создавшей объект.

К моменту обращения к свойству объекта, функция-конструктор может уже не существовать, а свойство prototype может содержать совершенно другое значение (не прототип объекта), поэтому интерпретатор к свойству prototype конструктора вообще не обращается, поиск осуществляется по другой неявной цепочке. Это важно. 


Вопрос: "О какой цепочке речь?". Может кто-нибудь четко объяснить механизм поиска при обращении к свойству объекта?

Добавлено @ 22:04
Для пояснения приведу пример:

Код
// Конструткор класса
var Class = function() {
    this.thereisnospoon = 'O_O';
}

// Добавим метод в прототип
Class.prototype.method = function() {
    alert(this.thereisnospoon);
}

// Создаем экземпляр объекта
var o = new Class();
// Вызов метода
o.method(); // Выведет "О_О"

// Чистим прототип
Class.prototype = {};

// Вызов метода
o.method(); // Выведет "О_О"


Как возможно, что второй вызов метода срабатывает?
Точнее где теперь хранится метод, если в контексте объекта он не создавался, а прототип пуст?

Это сообщение отредактировал(а) Burrr - 29.4.2008, 22:06


--------------------
PM MAIL ICQ   Вверх
ksnk
Дата 29.4.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Объект несколько сложнее, чем можно выразить средствами JavaScript  smile 
Своими словами - прототип объекта при создании нового элемента копируется в скрытое поле самого объекта. Это поле, imho, доступно нам только в ощущениях, напрямую заюзать его нельзя... 
Свойство prototype объекта (не функции) никакого дополнительного смысла не несет, да и вообще никакого смысла не несет кроме заданного пользователем smile ... Свойство propotype функции имеет смысл только на момент срабатывания оператора new


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Burrr
Дата 29.4.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



ksnk
1) У объектов нет прототипа, прототипы есть только у конструкторов.
2) Если бы при создании каждого экземпляра объекта прототип конструктора записывался бы в скрытое поле объекта, то это немеряно жрало бы память, чего не наблюдается, да и смысла не было бы в такой реализации прототипирования.

Добавлено @ 23:21
ksnk, правильней будет сказать "Экземпляры объекта наследуют свойства и методы от прототипа конструктора, но не имеют собственного прототипа".

Это сообщение отредактировал(а) Burrr - 29.4.2008, 23:23


--------------------
PM MAIL ICQ   Вверх
ksnk
Дата 29.4.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Burrr @  29.4.2008,  23:17 Найти цитируемый пост)
1) У объектов нет прототипа, прототипы есть только у конструкторов.

Что такое конструктор? по моему это - функция, к которой применяется оператор new... imho, я про это и говорил ;-)
Цитата(Burrr @  29.4.2008,  23:17 Найти цитируемый пост)
2) Если бы при создании каждого экземпляра объекта прототип конструктора записывался бы в скрытое поле объекта, то это немеряно жрало бы память, чего не наблюдается, да и смысла не было бы в такой реализации прототипирования.

Вообще-то я подразумевал ссылку на "объект". Скопировать один указатель на объект это тоже расточительство? Весь prototype-based механизм наследования на этом и строится... 
Можно сочинить тест, "унаследовав" объект A от обьекта B, а затем добавив свойство в объект В. Чудесным образом это-же свойство появляется и у А...

Добавлено через 2 минуты и 3 секунды
Цитата(Burrr @  29.4.2008,  23:17 Найти цитируемый пост)
но не имеют собственного прототипа

В свете предложенного эксперимента такая фраза вызывает недоумение и желание уточнить, что-же такое прототип smile

Добавлено через 7 минут и 17 секунд
Код

var b={x:1111}; 

function obj(){} ; 
obj.prototype = b ;

var a =new obj(); 
alert([a.x,a.y]);

b.y=2222;
alert([a.x,a.y]);



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Burrr
Дата 30.4.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



ksnk, нужно определиться с терминологией, иначе комментарии будут вводить в заблуждение. В JavaScript всё является объектами, но для ясности некоторые объекты следует называть иначе.

И так:
Цитата(ksnk)
Своими словами - прототип объекта при создании нового элемента копируется в скрытое поле самого объекта

правильно звучит так: "Прототип конструктора при создании экземпляра объекта копируется в скрытое поле этого конструктора".
В таком свете всё становится ясно и нареканий не вызывает smile
Только откуда взято такое утверждение? Есть чем подтвердить или это догадка?

Цитата(ksnk)
Вообще-то я подразумевал ссылку на "объект". Скопировать один указатель на объект это тоже расточительство?

Нет это не расточительство. Но где хранится эта предполагаемая ссылка? В экземпляре объекта или в конструкторе?

Цитата(ksnk)
В свете предложенного эксперимента такая фраза вызывает недоумение и желание уточнить, что-же такое прототип

Прототип - это свойство конструктора, хранящее ссылку на объект, содержащий хеш со свойствами и методами, например, со свойством constructor, указывающего обратно на функцию конструктор.

Цитата(ksnk)
Можно сочинить тест, "унаследовав" объект A от обьекта B, а затем добавив свойство в объект В. Чудесным образом это-же свойство появляется и у А...

Вы не очень понимаете что такое наследование и ваш пример - это создание 2-х экземпляров объекта одного класса, которые достают свое свойство из прототипа конструктора, в котором в своб очередь стоит ссылка на глобальный oбъект b = {} и не более того.

Добавлено @ 00:09
Сразу поясню насчет наследования:

Наследование - это понятие из ООП, подразумевающее возможность порождать один класс от другого с сохранением свойств-методов класса родителя, возможностью их переопределения и добавленич новых свойств-методов.

За неимением классов, реализация наследования через прототип в JavaScript от одного конструктора другому - не такая уж простая задача.

Это сообщение отредактировал(а) Burrr - 30.4.2008, 00:17


--------------------
PM MAIL ICQ   Вверх
Burrr
Дата 30.4.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



Ага, а вот и ответ на мой первоначальный вопрос:
http://www.javascript.ru/tutorial/object/i...type-i-prototip


--------------------
PM MAIL ICQ   Вверх
ksnk
Дата 30.4.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Burrr @  30.4.2008,  00:03 Найти цитируемый пост)
Прототип конструктора при создании экземпляра объекта копируется в скрытое поле этого конструктора

Хмм...
Для моего примера - obj - конструктор, b - прототип, a - объект. 
Согласно отквоченному утверждению, после строки a= new obj(); в obj будет содержаться скрытая ссылка на b.
Что будет если заменить obj.prototype и сделать генерацию нового объекта?

Или конструктор - более сложная субстанция?

imho, каждый объект содержит по крайней мере два скрытых списка - список конструкторов, с которым работает инструкция instanceof  и список прототипов (поле __proto__ для FF ), по которому производится поиск свойств этого объекта. Формируются эти списки в момент выполнения new. Ну и конечно, для хранения всего этого списка в каждый новый объект достаточно добавить пару ссылок...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Burrr @  30.4.2008,  00:29 Найти цитируемый пост)
Ага, а вот и ответ на мой первоначальный вопрос:...

Я, конечно, понимаю, что найти что-то стоящее не так-то просто. Слово javascript  в строке поиска вернет что-нибудь, типа "Центральный Javascript-ресурс" (кто его сделал центральным?), а слово prototype так вообще вернет результат не для слабонервных. Тем не менее, можно, проявив смекалку, набрать какую-нибудь хитрую комбинацию слов, одним из которых задать известное имя. Тогда может попасться ссылка на форум dklab, а там уже прямая дорога к шпаргалке всех времен и народов — http://forum.dklab.ru/viewtopic.php?p=102575#102575.
Читать же то, что написано на "центральных ресурсах", где авторы по наитию описывают все своими словами, пытаясь наобум попасть пальцем в небо, довольно утомительное занятие. Ведь надо еще догадаться, что имеется ввиду, когда используется ненормативная лексика (в рамках ECMAScript Language Specification) или собственные фантазии вместо фактов. Например:
Цитата(www.javascript.ru)

Ссылка на прототип создается оператором new во время создания объекта. 

Ее значением становится свойство prototype функции-конструктора. Значение prototype указывает, от кого будут наследовать новые объекты.

Указывает, от кого наследовать, значит? Что и от кого будет наследовано вот здесь:
Код

function F() {};

F.prototype = 'prototype';

var f = new F;

?
Или как уразуметь вот это:
Цитата(www.javascript.ru)

Когда Вы ставите это свойство - Вы как бы говорите "все новые объекты будут иметь прототип XXX".

"Ставите", "говорите"? Бо-о-о-же мой!
А вот еще:
Цитата(www.javascript.ru)

Наверху цепочки всегда находится объект встроенного класса Object.

Далее картинка, изображающая:
Цитата(www.javascript.ru)

animal.[[Prototype]] => встроенный объект JS

И в заключении:
Цитата(www.javascript.ru)

Благодаря тому, что вверху цепочки наследования стоит Object, все остальные объекты имеют доступ к этому функционалу.

Вот как догадаться после таких объяснений, кто и где там "стоит" или "находится"?

Добавлено @ 07:38
Цитата(ksnk @  30.4.2008,  01:20 Найти цитируемый пост)
объект содержит по крайней мере два скрытых списка - список конструкторов, с которым работает инструкция instanceof...

Зачем объекту содержать список конструкторов, если instanceof конструкторами "не интересуется" (они могут быть полезны лишь в качестве операнда)?


Это сообщение отредактировал(а) AKS - 30.4.2008, 07:39
PM MAIL   Вверх
ksnk
Дата 30.4.2008, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  30.4.2008,  07:30 Найти цитируемый пост)
если instanceof конструкторами "не интересуется"

? Каким, интересно образом вот такая конструкция может сработать a=new Array(); alert(a instanceof Array);, есль объект a не будет содержать ссылку на функцию Array?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(ksnk @  30.4.2008,  08:22 Найти цитируемый пост)
Каким, интересно образом вот такая конструкция может сработать a=new Array(); alert(a instanceof Array);, есль объект a не будет содержать ссылку на функцию Array?

Этот instanceof мог бы выглядеть примерно так (абстрактно):
Код

alert(a.[[Prototype]] === Array.prototype);

, или в FF вот так:
Код

alert(a.__proto__ === Array.prototype);

Так что объекту a не надобности в "ссылках" на функцию Array. Именно этот принцип позволяет вот такому выражению быть истиной:
Код

alert(Object instanceof Function === Function instanceof Object);

PM MAIL   Вверх
ksnk
Дата 30.4.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  30.4.2008,  09:42 Найти цитируемый пост)
alert(a.__proto__ === Array.prototype);

Таки да... Видимо, так оно и сделано... Правда выглядит это как-то стремно...
Код

var b={xxx:1111} ; // объект предок
var c={yyy:2222} ; // второй объект предок

function obj(){} // конструктор 
obj.prototype=b;

function obj1(){} // конструктор 
obj1.prototype=b;

var a=new obj();
alert([a instanceof obj,a instanceof obj1,a.yyy]); // true, true,

obj.prototype=c;
alert([a instanceof obj,a instanceof obj1,a.yyy]); // false, true,

b.yyy=3333;
alert([a instanceof obj,a instanceof obj1,a.yyy]); // false, true, 3333
 


Это сообщение отредактировал(а) ksnk - 30.4.2008, 10:05


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(ksnk @  30.4.2008,  10:04 Найти цитируемый пост)
Правда выглядит это как-то стремно...

А какие именно результаты смущают? Или "стремен" сам оператор instanceof? Если оператор, то о нем уже давно все сказано...
PM MAIL   Вверх
ksnk
Дата 30.4.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Я интуитивно расчитываю, что конструкция a instanceof obj  будет выдавать true всегда, а конструкция a instanceof obj1 будет выдавать всегда false... smile При "моей" схеме реализации "наследования" было бы интуитивно правильнее  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Zeroglif
Дата 30.4.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Все беды, братцы, от переизбытка в javascript самого слова "prototype":

- object's prototype;
prototype-based inheritance;
- each constructor has a prototype property
- every constructor has an associated prototype;
- constructor has an implicit reference to the prototype;
- implicit prototype chain;
prototype is an object;
- ...

Если сюда ещё добавить и общий смысл - prototype (образец, прототип) и вспомнить заодно про одноимённую библиотеку, с помошью которой про прототип гуглить уже бесполезно, то картинка удручает...  smile 



PM MAIL WWW   Вверх
AKS
Дата 30.4.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Zeroglif @  30.4.2008,  11:45 Найти цитируемый пост)
Все беды, братцы, от переизбытка в javascript самого слова "prototype"

С этим, вроде бы, жить можно (потихоньку, не высовываясь smile ). Но вот "гениально" названная библиотека здорово людям засоряет мозги, так же, как и "эфирное" пространство. 

Цитата(ksnk @  30.4.2008,  10:40 Найти цитируемый пост)
При "моей" схеме реализации "наследования" было бы интуитивно правильнее

Интуиция может и подвести (тогда, когда конструкторы ассоциируются с классами).

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.