2017-06-13 52 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