2016-04-27 75 views
1

有人可以請解釋這種行爲給我。奇怪的行爲與建設者

首先讓我們創建一個構造函數和使用構造一個新的對象:如預期

var MyConstructor = function() {}; 
var obj = new MyConstructor(); 

一切:

console.log(obj.constructor === MyConstructor); //true 
console.log(obj.__proto__ === MyConstructor.prototype); //true 

讓我們再試一次,但這次讓我們自定義的原型添加到構造函數:

var MyConstructor2 = function() {}; 
var myProto = { fld: 'val' }; 
MyConstructor2.prototype = myProto; 
var obj2 = new MyConstructor2(); 

現在,事情並不像我期待他們:

console.log(obj2.constructor === MyConstructor2); //false?!?! 
console.log(obj2.constructor === Object); //true, b-but i didnt use Object.. 
console.log(obj2.__proto__ === MyConstructor2.prototype); //true 

爲什麼obj2.constructorObject,而不是MyConstructor2

--- edit1 ---

只是爲了澄清。如果你創建一個新的功能:

var MyConstructor = function() {}; 

然後Javascript實現也將創造一個新的對象:

var temp = { constructor: MyConstructor }; 

並將其設置爲:

MyConstructor.prototype = temp; 

這裏要注意的一點是,臨時對象將覆蓋constructor字段Object.prototype(默認情況下爲Object.prototype.constructor === Object)。

所以,當我使用構造函數創建一個新的對象:

var obj = new MyConstructor(); 

那麼對象繼承指向MyConstructor構造領域。在第二種情況下沒有覆蓋,所以第二個對象直接從Object.prototype繼承構造函數字段。

+1

你應該值MyConstructor2新設置的原型對象添加一個constructor屬性(myProto) – Redu

回答

3

每個Function對象有一個prototype屬性,其「構造函數」屬性引用該函數。當您使用Object文字語法創建新原型時,會創建一個全新的對象,其構造函數實際上是Object函數。您需要明確設置constructor屬性:

function MyConstructor2() { 

} 

MyConstructor2.prototype = { 
    constructor: MyConstructor2 
};