Object.create,chaining和'this'

时间:2017-06-13 03:29:24

标签: javascript object

鉴于以下程序,控制台正确记录 - 请注意链式init函数和return this

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();

2 个答案:

答案 0 :(得分:15)

这是有效的原因:

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,即{ {1}}没有退货声明。

答案 1 :(得分:4)

正如@zerkms所提到的,如果 @Query(value = "select COUNT(a.doctorId) from Appointment a WHERE a.doctorId = :doctorId AND a.scheduleFromTime = :appointmentDateTime") Long findAppointmentExists(@Param("doctorId") Long doctorId, @Param("appointmentDateTime") Date appointmentDateTime); 缺少一个return语句,它将返回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');