2017-05-08 202 views
1

我已經創建了自己的new函數創建一個對象,並返回其關於return關鍵字

function Person(firstName, lastName) { 
    this.firstName = firstName 
    this.lastName = lastName 
} 

Person.prototype.getName = function() { 
    console.log(this.firstName + " " + this.lastName) 
} 

function spawn(constructor) { 
    var obj = {} 
    Object.setPrototypeOf(obj, constructor.prototype); 
    var myArray = Array.prototype.slice.apply(arguments) 
    return constructor.apply(obj, myArray.slice(1)) || obj 

} 

var crockford = spawn(Person, "Douglas", "Crockford") 
crockford.getName() 

的問題是,當我設置這樣的回報:

return constructor.apply(obj, myArray.slice(1)) || obj它的工作原理,但是當我設置類似如下的回報:

return obj || constructor.apply(obj, myArray.slice(1))它說未定義

有什麼區別是這兩個?

回答

2

當您設置obj || constructor.apply(obj, myArray.slice(1)),返回的值是因爲在第一個值的obj ||條件是真的。如果它是錯誤的,那麼只有它會試圖評估另一部分。

但是,你objnot empty

Object.setPrototypeOf(obj, constructor.prototype);Object.setPrototypeOf(obj, constructor.prototype);在兩種情況下都執行並且obj的原型被設置爲Person,因爲constructor在spawn函數中的參數不過是Person

在第一種情況下,由於return constructor.apply(obj, myArray.slice(1)) || obj你打電話Person功能與參數DouglasCrockford但在第二種情況下,你甚至不調用構造函數。

因此,firstName和lastName屬性不能附着到this對象。

由於缺乏firstName和lastName值的,你看不確定不確定,而由於調用構造函數第一種情況下,你看到了道格拉斯·克羅克福德。

要清楚return constructor.apply(obj, myArray.slice(1)) || obj將返回的第二部分||因爲constructor.apply(obj, myArray.slice(1))將返回undefined。由於apply(),屬性firstName和lastName將附加到obj對象本身。

+0

那麼'constructor.apply(obj,myArray.slice(1))'是錯誤的? –

+0

@AhMedRaXa調用'constructor.apply(obj,myArray.slice(1))'以Douglas和Crockford爲參數調用Person函數。由於這個,當你調用getName()時,函數有this.firstName和this.lastName。 –

+0

我的意思是如何評估'constructor.apply(obj,myArray.slice(1))'是否爲假,以便它正在評估'||'的右側? –