2013-06-18 27 views
1

根據this MSDN article - 滾動到Constructor Functions but No Classes,(和讀取MDN JS引用後)我應該能夠構建這樣一個對象:的JavaScript:構建新實例的方式

function Dog(name){ 
    this.name = name; 
} 

// EXAMPLE 1 
var dog = new Dog("Spot"); 
console.log("Dog using new:"); 
console.log(dog); // Dog object, awesome! 

// EXAMPLE 2 
var dog = {}; 
dog = Dog.call(dog,"Rowdie"); 
console.log("Dog using call:"); 
console.log(dog); // Undefined.. why? 

然而,當第一示例(構建新對象的最常見方法)返回預期的實例,第二個示例返回undefined - 我做錯了什麼?

這裏是我用來測試這一點的jsfiddle:http://jsfiddle.net/wk8JD/1/

回答

7

變化

dog = Dog.call(dog,"Rowdie"); 

Dog.call(dog,"Rowdie"); 

當你調用一個函數new,然後this隱含退換,即該函數的行爲如同您在return this;處結束。從MDN documentation

構造函數返回的對象成爲整個new表達式的結果。如果構造函數沒有顯式返回對象,則使用在步驟1中創建的對象。 (通常構造函數不返回值,但他們可以選擇這樣做,如果他們想覆蓋正常的對象的創建過程。)

但是,如果你調用一個函數「正常」(不new即)如果沒有return聲明,它將返回undefined

(在文章中他們沒有指派返回值要麼BTW)

+0

我無法相信我錯過了!!!!!!!謝謝! – Jeff