2017-06-13 57 views
6

正確地給出下面的程序,控制檯日誌 - 注意鏈init功能和return this的Object.create,鏈接和 '本'

const cat = { 
 
    init(sound) { 
 
    this.sound = sound; 
 
    return this; 
 
    }, 
 
    makeSound() { 
 
    console.log(this.sound); 
 
    } 
 
}; 
 

 
const fluffy = Object.create(cat).init('meeeaaaauuu'); 
 
fluffy.makeSound();

我的問題:如何以及爲什麼它工作所需要的return this下面看到它的錯誤刪除:

const cat = { 
 
    init(sound) { 
 
    this.sound = sound; 
 
    // return this 
 
    }, 
 
    makeSound() { 
 
    console.log(this.sound); 
 
    } 
 
}; 
 

 
const fluffy = Object.create(cat).init('meeeaaaahuuu'); 
 
fluffy.makeSound();

MDN規定的Object.create返回新的對象,所以鏈接的init()應該工作......經過思考它... 是因爲被鏈接的新對象仍然是「匿名」的?

注意,如果init()都有自己的路線,因爲我希望所有的作品,而無需return this

const fluffy = Object.create(cat); 
fluffy.init('meeeaaaahuuu'); 
fluffy.makeSound(); 
+5

你'init'方法什麼都不返回。所以'const fluffy'等於'undefined'。它與'Object.create'無關。 – zerkms

+0

哦 - 所以當鏈接一個不返回任何東西的方法時,原來的返回值(新的貓對象)會丟失?用init調用它時,const蓬鬆不等於新對象嗎? – calipoop

+5

不要把「鏈接」當作神奇或特殊的東西。如果可能的話,我甚至會依法禁止使用「鏈接」術語:人們出於某種原因將特殊屬性賦予一個只返回某些東西的函數。 – zerkms

回答

13

之所以這樣工作的:

const fluffy = Object.create(cat); 
fluffy.init('meeeaaaahuuu'); 
fluffy.makeSound(); 

是因爲你分配fluffy返回值爲Object.create。當你做const fluffy = Object.create(cat).init('meeeaaaahuuu');時,你打電話init返回值爲Object.create,並且將init的返回值分配給fluffy,即undefined沒有返回語句。

4

由於@zerkms提到,如果init缺少返回語句,它將返回undefined

在以下行,fluffy是越來越分配由init

const fluffy = Object.create(cat).init('meeeaaaahuuu'); 

返回的值如果init缺乏回報聲明,fluffy將被分配值undefined

console.log(fluffy); // undefined 

如果init回報對象被分配到cat,那麼fluffy將被分配該值。

爲了證明這一點的另一種方式,你的鏈接賦值語句const fluffy = Object.create(cat).init('meow');也可以寫成這樣了相同的結果

let fluffy = Object.create(cat); 
fluffy = init('meow'); 
+0

感謝您的完整答案!凱爾用我的大腦更容易的方式回答了這個問題,所以我會給他支票,儘管這兩個答案看起來都不錯並且有幫助。另外,你目前在9,999代表,這很酷;) – calipoop

+0

np。我喜歡@凱爾的回答也:) – sfletche