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

Из http://www.jibbering.com/faq/faq_notes/closures.html:

Примечание: ECMAScript определяет внутреннее [[прототип]] свойство внутреннего Типа объекта. Это свойство не непосредственно доступно со сценариями, но это - цепочка объектов, упомянутых с внутренним [[прототип]] свойство, которое используется в разрешении средства доступа свойства; опытная цепочка объекта. Общедоступное опытное свойство существует для разрешения присвоения, определения и управления прототипами в сотрудничестве с внутренним [[прототип]] свойство. Детали отношений между к два описаны в ECMA 262 (3-й выпуск) и выходят за рамки этого обсуждения.

Каковы детали отношений между двумя? Я просмотрел ECMA 262 и все, что я считал существует материал как:

На прототип, связанный с конструкторами может сослаться выражение программы constructor.prototype,

Собственные объекты ECMAScript имеют внутреннее свойство под названием [[Прототип]]. Значение этого свойства является или пустым указателем или объектом и используется для реализации наследования.

У каждой встроенной функции и каждого встроенного конструктора есть объект Прототипа функции, который является начальным значением выражения Function.prototype

Каждый встроенный объект прототипа имеет Объектный объект прототипа, который является начальным значением выражения Object.prototype (15.3.2.1), как значение его внутреннего свойства [[Prototype]], кроме самого Объектного объекта прототипа.

От этого всего я собираюсь, то, что свойство [[Prototype]] эквивалентно prototype свойство для в значительной степени любого объекта. Действительно ли я ошибаюсь?

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
поделиться
Другие вопросы по тегам:

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