является объектом.getPrototypeOf () то же, что и Object.конструктор.прототип в Javascript?

есть ли разница между Object.getPrototypeOf(obj) и obj.constructor.prototype? Или эти двое ссылаются на одно и то же?

2 ответов


нет

он возвращает внутреннюю [[Prototype]] значение.

например:

var o = Object.create(null);
Object.getPrototypeOf(o); // null
o.constructor.prototype; // error

var p = {};
var o = Object.create(p);
Object.getPrototypeOf(o); // p
o.constructor.prototype; // Object.prototype

o.constructor.prototype работает только с объектами, созданными с помощью new ConstructorFunction или где вы вручную установили Prototype.prototype.constructor === Prototype отношения.


нет. В частности,constructor свойство объекта не всегда устанавливается на то, что вы считаете "правильным"."

пример, где getPrototypeOf работает, а .constructor.prototype нет:

function F() { }
F.prototype = {
   foo: "bar"
};

var obj = new F();

assert.equal(obj.constructor.prototype, Object.prototype);
assert.equal(Object.getPrototypeOf(obj), F.prototype);

Он также терпит неудачу для типичных прототипических сценариев наследования:

// G prototypally inherits from F
function G() { }
G.prototype = Object.create(F.prototype);
// or: G.prototype = new F();

var obj2 = new G();

assert.equal(obj2.constructor.prototype, Object.prototype);
assert.equal(Object.getPrototypeOf(obj2), G.prototype);
assert.equal(Object.getPrototypeOf(Object.getPrototypeOf(obj2)), F.prototype);