Я считаю, что вы правы в большинстве случаев.
Каждый объект имеет скрытое свойство [[Prototype]]
, которое используется для наследования. Функции дополнительно имеют открытое свойство prototype
, которое используется только в том случае, если функция используется в качестве конструктора: когда объект создается с использованием new
, свойству [[Prototype]]
нового объекта присваивается свойство prototype
функция, которая использовалась в качестве конструктора.
1010 * Е.Г. *
function C() {}
C.prototype = P1;
var obj = new C(); // obj.[[Prototype]] is now P1.
Вы можете получить свойство [[Prototype]]
, используя Object.getPrototypeOf(<obj>)
. (Этот метод указан в ECMAScript 5. В старых версиях JavaScript нет стандартного способа чтения [[Prototype]]
).
Вы можете обычно добраться до прототипа через конструктор, например ::1010 *
obj.constructor.prototype == Object.getPrototypeOf(obj)
Но это не всегда так, поскольку свойство prototype функции конструктора может быть переназначено, но [[Prototype]]
объекта нельзя переназначить после создания объекта. Так что если вы делаете:
C.prototype = P2;
тогда
obj.constructor.prototype != Object.getPrototypeOf(obj)
Поскольку прототип C
теперь P2
, но [[Prototype]]
из obj
по-прежнему P1
.
Обратите внимание, что только функции имеют свойство prototype
. Также обратите внимание, что свойство prototype
функции не совпадает со свойством [[Prototype]]
функции!