《深入理解ES6》阅读笔记 --- 扩展对象的功能性

《深入理解ES6》阅读笔记 --- 扩展对象的功能性

在《红宝书》里是这样来说对象初始值的:

var name = 'icepy'
var age = 18
var obj = {
  name: name,
  age: age,
  say: function(){
    console.log(this.name)
  }
}

到了ES6中,你可以使用一个更简写的方式:

let name = 'icepy'
let age = 18
let obj = {
  name,
  age,
  say(){
    console.log(this.name)
  }
}

比之ES5,这拥有了极致的简化,而且使用say(){}定义的属性可以调用super。

这一小节里讲的内容,比较重要的是讲原型的增强,其他的比如对对象的增强,仅是添加了几个我们已经比较常用的方法了:

  1. Object.is
  2. Object.assign
  3. Object.setPrototypeOf

可能某些情况下会出现这样的状况,A类是B类的父类,A类定义了say方法,B类也定义了say方法,在B类的parentSay中调用A类的say方法,实例化B类,直接调用parentSay方法,这个时候我们就很尴尬了,如果调用this.say,不一定能调用到A类定义的say方法。在ES5中给我们提供了一个getPrototypeOf方法来获取任意一个对象的原型,根据JS的继承机制我们可以知道如果调用Object.getPrototypeOf(this)正好就可以获取到父类的原型,然后再调用say方法就可以了。

但,这也有一个很尴尬的问题,于是,ES6给我们提供了super来代表父类,这个时候,我们直接使用super.say()就很方便的区别调用A类的say方法和B类的say方法了。

有趣的是,ES6还为我们提供了一个设置原型的方法“setPrototypeOf”,这个方法可以设置原型对象。

如果曾经你使用过类似jQuery的extend方法,那么就应该对assign会有相当熟悉了感觉,它和extend非常类型,可以将一对象中的属性,方法赋值给另一个对象。至于is,就是一个正确的布尔值比对,大部分情况下与 === 行为一致。

编辑于 2018-08-12

文章被以下专栏收录