Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Тонкости создания прототипов (https://javascript.ru/forum/misc/63521-tonkosti-sozdaniya-prototipov.html)

aklis 13.06.2016 12:58

Я ж говорю не исполняется код этот в режиме конструктора.
Обратите внимание на сообщение номер 6 этой темы. Строка 11. Если вызвать этот конструктор как обычную функцию, до того как используем Element как конструктор, тогда все сработает. Но в режиме конструктора весь ваш код из Element игнорируется. Честно говоря Element вообще не конструктор, она не назначает свойств объекту.

pomidor_makaronus 13.06.2016 13:05

Кажется понял ответ как всегда на следующей странице):
Хотя свойства и методы, добавленные в прототип, немедленно становятся доступны
во всех экземплярах объектов, при перезаписи всего прототипа наблюдается другое
поведение. Указатель [[ Prototype ]] задается при вызове конструктора, поэтому
изменение прототипа на другой объект нарушает связь между конструктором
и оригинальным прототипом. П омните, у экземпляра есть указатель только на
прототип, но не на конструктор. Рассмотрим следующий пример:

function Person ( ) {
}
var friend = new Person() ;
Person . p rototype = {
constructor : Person ,
name : "Nicholas" ,
age : 2 9 ,
job : " Software Engineer " ,
sayName : function(){
alert ( this.name ) ;
}
} ;
friend.sayName();// ошибка


После этого попробовал
var el = new Element();
			el = new Element();
			el.getTags("div");

Теперь понял эту тонкость. что кстати подтверждает 6-е сообщение. Спасибо!

aklis 13.06.2016 13:05

А нет, попробовал - не игнорируется код. Надо думать тогда.

aklis 13.06.2016 13:08

Вот оно что :)

pomidor_makaronus 13.06.2016 13:11

Просто получается, что перезапись происходит не у __proto__ который взял ссылку у prototype на момент первого создания
а именно у свойства prototype функции Element.

aklis 13.06.2016 13:17

Я кстати разницу так до конца и не понял между __proto__ и prototype.

Вроде как __proto__ это конкретно свойство уже существующего объекта, а prototype это свойство конструктора которое влияет на __proto__ в будущем созданных объектов?

pomidor_makaronus 13.06.2016 13:20

Да я мыслю его также. теперь просто стало понятнее как оно инициализируется.

pomidor_makaronus 13.06.2016 13:29

Цитата:

Сообщение от aklis (Сообщение 419258)
Честно говоря Element вообще не конструктор, она не назначает свойств объекту.

Полностью с этим согласен. никаких this нету.
Да уместнее говорить не о prototype конструктора, а о prototype функции
Element

pomidor_makaronus 13.06.2016 13:41

А вот и картинка поясняющая этот момент Здесь [[ Prototype ]] означает __proto__:

aklis 13.06.2016 14:09

Цитата:

Сообщение от pomidor_makaronus
Здесь [[ Prototype ]] означает __proto__:

В спецификации так же.


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