這個問題純屬學術價值。爲什麼對象的構造函數返回Object()而不是構造函數?
給定一個構造函數Foo()
:
function Foo(){
this.x = 1;
}
和類的一個實例:
var o = new Foo(); // Instance of Foo()
console.log(o.constructor); // => Foo(): The constructor of `o` is `Foo()` - this makes sense so far.
但是,如果設置了手動Foo()
構造函數的prototype屬性...
Foo.prototype = { z: 3};
var o = new Foo(); // Instance of Foo()
o
's constructo R爲Object()
,所以不Foo()
:
console.log(o.constructor); // => Object {}
我得到Foo()
(鄰的構造函數的prototype
屬性)發生變化,但不是Foo()
仍然Foo()
實例的構造函數?是不是prototype
屬性的 Foo()被改變,而不是Foo()本身?
你問的'.constructor'屬性不是一個魔術屬性。這是一個默認分配給每個函數的原型對象並指向該函數的普通屬性。當你替換函數的默認原型對象時,你會擺脫那個默認的'.constructor'屬性。 –
因此,爲了理解,'o'從'Foo.prototype.constructor'繼承它的構造函數屬性?因此,通過用'{}'等對象覆蓋'Foo.prototype',而不是繼承該對象的構造函數屬性,因此返回'Object()'作爲構造函數而不是'Foo()'。那是對的嗎? – dkugappi
我想我的遺漏鏈接是'o.constructor'從'Foo.prototype.constructor'繼承的事實。我出於某種原因認爲'o.constructor'是任何JS對象的一個屬性,而不是從其構造函數的'prototype'屬性繼承的屬性。 – dkugappi