В:
> var obj = new Function();
новая функция создается объект, внутренний [[Prototype]]
(или __proto__
в браузерах, которые поддерживают его) ссылается Function.prototype
, то есть встроенные функции конструктора public prototype и присваивается переменной OBJ ,
Поскольку OBJ является объектом Function, он имеет прототип свойство по умолчанию только в случае, если она будет использоваться в качестве конструктора.
В:
> obj.prototype.x = "a";
новое свойство х добавляется obj.prototype, которому присваивается значение строки 'a'
. Обратите внимание, что obj имеет свойство prototype по умолчанию, потому что это объект Function.
Итак:
obj.prototype === obj.__proto__
по существу:
obj.prototype === Function.prototype
, который явно ложно.
Таким образом, чтобы ответить на вопрос «Лучший способ получить прототип объекта JS», вы можете обратиться к публичному прототипу конструктора через свой прототип .
Вы можете получить доступ к внутреннему экземпляру экземпляра [[Prototype]]
с использованием ES5 Object.getPrototypeOf, однако он может не поддерживаться повсеместно.
Вы также можете получить доступ к внутреннему экземпляру экземпляра [[Prototype]]
с использованием нестандартного __proto__
, если поддерживается.
Более общее решение сохранить ссылку на прототип конструктора в момент создания экземпляра (так как изменения прототипа конструктора на более позднем этапе не изменят [[Prototype]]
экземпляров, которые уже были созданы).
Таким образом, в общем случае вы можете сделать:
function Foo() {
this.internalProto = Foo.prototype;
}
var foo = new Foo();
// ES5, where supported
Object.getPrototypeof(foo) == Foo.prototype; // true
foo.internalProto == Foo.prototype; // true
// Non–standard, Where supported
foo.internalProto == foo.__proto__; // true
proto == contructor.prototype – dandavis
Возможный дубликат [Что означает это предложение: «Другими словами, obj.proto тип вообще не является объектом {Prototype} объекта obj. "] (http://stackoverflow.com/questions/21075114/what-does-this-sentence-mean-in-other-words-obj-prototype-is-in- general-not-t), [Почему это поведение? __ proto__ vs prototype?] (http://stackoverflow.com/q/16394709/1048572) и в основном [__proto__ Vs. прототип в JavaScript] (http://stackoverflow.com/q/9959727/1048572) – Bergi