9

Object.getPrototypeOf(obj)obj.constructor.prototype有什麼不同?還是這兩個引用相同的東西?是Object.getPrototypeOf()是否與Object.constructor.prototype在Javascript中相同?

+1

您可以upvote有用的問題和答案,並接受解決您自己的問題的答案。這有助於組織SO,對幫助你的人也是一個小小的回報。 – hugomg

+1

@missingno他迄今爲止的問題很有趣,雖然... –

+1

@ŠimeVidas:他仍然值得「0%」樣板評論,雖然:P – hugomg

回答

9

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

。特別是,對象的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); 
相關問題