Отношение между [[Прототипом]] и прототипом в JavaScript

19
задан nicael 11 May 2014 в 18:57
поделиться

3 ответа

Я полагаю, что Вы правы в большинстве случаев.

Каждый объект имеет скрытое [[Prototype]] свойство, которое используется для наследования. Функции дополнительно имеют общественность prototype свойство, которое используется только, когда функция используется в качестве конструктора: Когда объект создается с помощью new, [[Prototype]], свойство нового объекта установлено на prototype свойство функции, которая использовалась в качестве конструктора.

, Например,

function C() {}
C.prototype = P1;  
var obj = new C();  // obj.[[Prototype]] is now P1.

можно добраться [[Prototype]] свойство с помощью [1 110]. (Этот метод указан в ECMAScript 5. Более старые версии JavaScript не имеют никакого стандартного способа читать [[Prototype]]).

Вы можете обычно , добираются до прототипа через конструктора, например:

obj.constructor.prototype == Object.getPrototypeOf(obj) 

, Но это не всегда имеет место, так как опытное свойство функции конструктора может быть повторно присвоено, но [[Prototype]] из объекта не может быть повторно присвоен после того, как объект создается. Таким образом, если Вы делаете:

C.prototype = P2;

затем

obj.constructor.prototype != Object.getPrototypeOf(obj)

, поскольку прототип [1 113] теперь P2, но [[Prototype]] из [1 116] все еще P1.

Примечание, что это только [1 122] функции, которые имеют prototype свойство. Обратите внимание также, что prototype свойство функции не является тем же как [[Prototype]] свойство функции!

47
ответ дан 30 November 2019 в 02:10
поделиться

Отвечать на Ваш вопрос непосредственно: логически это - частная копия объекта prototype свойство ее конструктора. Используя метаязык это - то, как создаются объекты:

// not real JS

var Ctr = function(...){...};
Ctr.prototype = {...}; // some object with methods and properties

// the object creation sequence: var x = new Ctr(a, b, c);
var x = {};
x["[[prototype]]"] = Ctr.prototype;
var result = Ctr.call(x, a, b, c);
if(typeof result == "object"){ x = result; }
// our x is fully constructed and initialized at this point

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

Ctr.prototype.log = function(){ console.log("...logging..."); };

x.log();  // ...logging..

, Но если мы изменяем прототип на конструкторе, уже созданные объекты продолжат относиться к старому объекту:

Ctr.prototype = {life: 42};
// let's assume that the old prototype didn't define "life"

console.log(x.life);  // undefined
x.log();              // ...logging...

В полном соответствии со стандартом [[prototype]] не доступно, но Mozilla расширяет стандарт с помощью __proto__ свойство (только для чтения), который выставляет обычно скрытый [[prototype]]:

Снова, __proto__ может быть легализован в [1 110] следующий стандарт ES3.1 .

12
ответ дан 30 November 2019 в 02:10
поделиться

В дополнение к ответу olavk: Некоторые реализации JavaScript (например, Mozilla ) позволяют получать доступ к свойству [[Prototype]] непосредственно...

4
ответ дан 30 November 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: