Я полагаю, что Вы правы в большинстве случаев.
Каждый объект имеет скрытое [[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]]
свойство функции!
Отвечать на Ваш вопрос непосредственно: логически это - частная копия объекта 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 .
В дополнение к ответу olavk: Некоторые реализации JavaScript (например, Mozilla ) позволяют получать доступ к свойству [[Prototype]] непосредственно...