является Object.getPrototypeOf () такой же, как Object.constructor.prototype в Javascript? - PullRequest
9 голосов
/ 06 ноября 2011

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

Ответы [ 2 ]

9 голосов
/ 06 ноября 2011
нет

NO

Возвращает внутреннее значение [[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.

2 голосов
/ 06 ноября 2011

Нет . В частности, свойство 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);
...