简介:不少概念不清或忘记,从新构建本身的知识体系。天天问本身1~多个问题。我是菜鸟 成为大神之路!
es6
Es6
Class
经过extends
关键字实现继承 Link Class & extends & super class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y); // 调用父类的constructor(x, y)
this.color = color;
}
toString() {
return this.color + ' ' + super.toString(); // 调用父类的toString()
}
}
复制代码
①上面代码中,constructor
方法和toString
方法之中,都出现了super
关键字,它在这里表示父类的构造函数,用来新建父类的this
对象。数组
②子类必须在constructor
方法中调用super
方法,不然新建实例时会报错。这是由于子类本身的this
对象,必须先经过父类的构造函数完成塑造,获得与父类一样的实例属性和方法,而后再对其进行加工,加上子类本身的实例属性和方法
。若是不调用super
方法,子类就得不到this
对象。函数
③在子类的构造函数中,只有调用super
以后,才能够使用this
关键字,不然会报错。这是由于子类实例的构建,基于父类实例,只有super
方法才能调用父类实例。ui
④父类的静态方法,也会被子类继承this
Mixin
模式实现多继承 Link MixinMixin
指的是多个对象合成一个新的对象,新对象具备各个组成成员的接口spa
将多个类的接口“混入”(mix in)另外一个类
prototype
function mix(...mixins) {
class Mix {}
for (let mixin of mixins) {
copyProperties(Mix.prototype, mixin); // 拷贝实例属性
copyProperties(Mix.prototype, Reflect.getPrototypeOf(mixin)); // 拷贝原型属性
}
return Mix;
}
function copyProperties(target, source) {
for (let key of Reflect.ownKeys(source)) { //Reflect.ownKeys()方法返回一个由目标对象自身的属性键组成的数组
if ( key !== "constructor"
&& key !== "prototype"
&& key !== "name"
) {
let desc = Object.getOwnPropertyDescriptor(source, key);//方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不须要从原型链上进行查找的属性)
Object.defineProperty(target, key, desc);//方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
}
}
}
复制代码