|
Тонкости создания прототипов
Друзья, подскажите, почему этот вариант прототипа не делает доступной функцию getTags, а тот который закомментирован - да?
function Element(){ if( typeof Element.getTags !== "function"){ //Element.prototype.getTags = function( elem ){ console.log( elem );} Element.prototype = { constructor: Element, getTags : function( elem ){ console.log( elem );} } } } var el = new Element(); el.getTags(); |
к моменту выполнения кода внутри функции Element() у создаваемого объекта уже установлен старый прототип. Закомментированный код добавляет функцию в этот прототип, а нерабочий вариант просто заменяет Element.prototype, что никак не сказывается на прототипе объекта - он остается прежним.
|
Cпасибо! звучит логично, но вот в книге Фленагана, алгоритм создания
нового объекта, как-то не похож: Для создания экземпляров Person используется оператор new. В результате выполняются четыре действия: 1. Создание объекта. 2. Назначение нового объекта переменной t h i s конструктора (после чего t h i s указывает н а новый объект). 3. Выполнение кода внутри конструктора (добавление свойств к новому объекту). 4. Возвращение нового объекта. Пытаюсь сопоставить ваш ответ с этим алгоритмом и напрашивается только один ответ: ссылка на прототип объекта возвращается вновь созданному объекту раньше чем происходит его инициализация! Пожалуйста дайте ссылку на материал, где можно это уточнить. Дело в том что пункты 3 и 4 очень уж смущают |
Ну в этом алгоритме про прототипы ничего не вижу.
|
мне кажется или когда Element работает в режиме конструктора код ТС просто игнорируется? Я имею в виду что если исполнить снаружи функции, код меняющий прототип, то работать он таки будет.
|
function Element(){ if( typeof Element.getTags !== "function"){ //Element.prototype.getTags = function( elem ){ console.log( elem );} Element.prototype = { constructor: Element, getTags : function( elem ){ console.log( elem );} } } } Element(); // или просто вызвать ее как обычную функцию, чтобы записать прототип var el = new Element(); el.getTags(); Уже размышляю насчет поспать, так что не проверял как это работает, все это просто мои мысли из разряда "а что если..." . Всем неспящим до завтра ;) |
Проверил, и правда так работает. Видимо конструктор работает в особом режиме, в котором код ТС игнорируется. Я вроде где-то про это читал (про особый режим работы конструкторов), не помню где только.
|
Что такое код TC, что-то не могу расшифровать абривиатуру?
Мне кажется не то чтобы код игнорировался просто: получается что когда выполняется строчка var el = new Element(); первым делом объект var el получает ссылку на прототип, а уже потом запускается алгоритм Фланагана?... И инфу не могу найти. Может чего не дочитал еще... Товарищи делитесь соображениями. |
ТС - topic starter.
var el - это переменная, тобишь именованная область памяти, куда мы записываем данные - это не сам объект. Ей присваивается ссылка на уже готовый объект. |
Цитата:
|
Часовой пояс GMT +3, время: 18:26. |
|