ES6-MIXIN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 //通过class实现混入
//extends 可以继承动态构造的类
const Mixin = Sup => class extends Sup {
//构造方法
//this关键字则代表实例对象
constructor(...args) {
//(1)作为函数调用时(即super(...args)),super代表父类的构造函数。
//(2)作为对象调用时(即super.prop或super.method()),super代表父类。注意,此时super即可以引用父类实例的属性和方法,也可以引用父类的静态方法。
super(...args);
}
}

class Widget {
constructor(width, height, $elem) {
Object.assign(this, {
width,
height,
$elem: null
});
}
render($where) {
if (this.$elem) {
this.$elem.css({
width: this.width + 'px',
height: this.height + 'px'
}).appendTo($where);
}
}
}

class Button extends Mixin(Widget) {
constructor(width, height, label){
super(width, height);
this.label = label;
this.$elem = $('<button>').text(this.label);
}
render($where) {
super.render($where);
this.$elem.click(this.onClick);
}
onClick() {
console.log('Button' + this.label + 'clicked!');
}
}
const $body = $(document.body) || document.body;
let btn = new Button(125, 30, 'hello world');
btn.render($body);