簡介:不少概念不清或忘記,從新構建本身的知識體系。天天問本身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);//方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。
}
}
}
複製代碼