2017-07-16 28 views
1

我的測試是基於創建函數的知識,這些函數將在JavaScript中作爲構造函數調用。關於JavaScript中的fallback構造函數模式?

function Clonetrooper(name, rank, age) { 
    this.name = name; 
    this.rank = rank; 
    this.age = age; 

我已經得到了到使用此行代碼

if (!(this instanceof Clonetrooper)) return new Clonetrooper(); 
} 

,以防止函數被調用時沒有新的關鍵字的做法。

老師/評分者注意到以下評論。

這是沒有必要的,實際上並沒有做你想要的 它要做什麼。 這將在'this'上設置屬性,然後返回Clonetrooper完全獨立的實例 而不設置這些屬性。

爲了公平起見我也忘了加上道具,像這樣......

if (!(this instanceof Clonetrooper)) return new Clonetrooper(name, rank, age); 

但實際上,事實證明,這並不重要......

做它像這樣,(像在原始的代碼)

if (!(this instanceof Clonetrooper)) return new Clonetrooper(); 

將返回一個對象,具有這些性質,它們僅保存值undefined

new Clonetrooper 
Clonetrooper {name: undefined, rank: undefined, age: undefined} 

那麼有人可以解釋他們的含義嗎?

+0

你期待什麼?該函數需要三個參數,如果你不傳遞任何東西給它,那些參數將有'undefined'作爲值。 –

+0

@ibrahimmahrir用這些屬性返回的對象。這似乎是正確的。 –

+0

試試這個:'return new Clonetrooper(name,rank);'以獲得更好的理解(只有'age'將會是'undefined')。 –

回答

0

在調用return new Clonetrooper();,你不傳遞任何參數,但預計3個參數,造成的Clonetrooper這些name, rank, age通話是不確定的,因此受到的

this.name = name; 
    this.rank = rank; 
    this.age = age; 

執行這些屬性中設置爲undefined新創建的對象,這就是爲什麼你得到

{name: undefined, rank: undefined, age: undefined}

0

這將設置親在'這''perties,然後返回

是主要問題。你不能運行所有的屬性初始化代碼,然後最終決定實際創建一個合適的新實例,你需要在一開始就紓解。

一個完全獨立的Clonetrooper實例,沒有設置這些屬性。

......他們的意思是參數值。


順便說一下,在現代ES6你會寫

function Clonetrooper(name, rank, age) { 
    if (!new.target) return new Clonetrooper(...arguments); 
    this.name = name; 
    this.rank = rank; 
    this.age = age; 
} 

或只使用class語法的時候了。