2015-03-01 4 views
1

Possible answer, но ответ показывает, что наблюдается, но не объясняет, почему так происходит.Уточнение: Javascript прототип обновления путаницы

Давайте создадим три конструктора функций.

function A() { 
} 

function B() { 
} 

function C() { 
} 
C.prototype.nm = "C"; 
B.prototype = new A() 
var obj = new B() 
B.prototype = new C() 
console.log(obj.nm); // prints, undefined. 

Итак, после последней строки я ожидал, что «obj» получит свойства от прототипа C, но это не так. Значит ли это, что как только объект создается, он привязан к любому прототипу, который был назначен во время создания? Почему это так, я имею в виду, что я могу получать живые обновления объекта через прототип, но не лучше ли получить обновления из нескольких объектов, просто изменяя свойство прототипа конструкторов?

+0

«Не было бы лучше, если бы вы могли получать обновления от нескольких объектов, просто изменяя свойство прототипов конструкторов» --- нет, это не так. – zerkms

+0

@zerkms, поэтому, как только объект будет создан, он привязан к определенному прототипу и получит только обновления от этого прототипа и ничего больше. – Bhimsen

+0

и это здорово. Именно так должен вести себя предсказуемый код. – zerkms

ответ

0

Означает ли это, что как только объект будет создан, он привязан к любому прототипу , который был назначен во время создания?

Да, точно. Объекты наследуют свойства объекта во внутреннем свойстве [[Prototype]].

Это свойство устанавливается при создании экземпляра:

13.2.2 [[Construct]]

  • Пусть прото будет значением вызова [[Get]] внутреннее свойство F с аргументом "prototype".
  • Если Type (прото) является объектом, установить [[Prototype]] внутреннее свойство OBJ к прото.

Но если изменить prototype свойство конструктора, это не повлияет на предыдущие экземпляры.

Фактически, prototype не является особенным сам по себе, это просто, что внутренний метод [[Construct]] использует его при создании экземпляров.

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

В основном да. Вы можете изменить его, но не рекомендуются (из-за проблемы с производительностью), используя:

  • __proto__: это было нестандартная недвижимость в Object.prototype, которые могут быть использованы в качестве геттера или сеттера [[прототип] ]. ECMAScript 6 standardized it в Приложении B (Дополнительные функции ECMAScript для веб-браузеров).

  • Object.setPrototypeOf, новый метод, введенный ECMAScript 6.

+0

Да, протестировал его. '__proto__' может использоваться для изменения прототипа объекта на что-то еще. Но он меняет свойство «конструктор». Это странно. – Bhimsen

0

Вы не назначаете B каких-либо конкретных свойств прототипа, чтобы цепь наследования была нарушена.

Смежные вопросы