# 混入
WARNING
- 对象的混入
- 类的混入
混入就是把两个对象和类的内容混合到一起,从而实现一些功能复用。
对象的混入
let adata = {
a: 'a'
}
let bdata = {
b: 'b'
}
console.log(Object.assign(adata, bdata))
// {a: 'a', b: 'b'}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
interface ObjectA {
a: string
}
interface ObjectB {
b: string
}
let Aa: ObjectA = {
a: 'a'
}
let Bb: ObjectB = {
b: 'b'
}
// Ab 的类型为交叉类型 ObjectA & ObjectB
let Ab = Object.assign(Aa, Bb)
console.log(Ab) // {a: 'a', b: 'b'}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
类的混入
class Amin {
funA() {}
}
class Bmin {
funB() {}
}
let mixinClass = (target: any, from: any) => {
Object.getOwnPropertyNames(from).forEach(key => {
target[key] = from[key]
})
}
mixinClass(Amin.prototype, Bmin.prototype)
let aa = new Amin()
console.log(aa)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

使用 implements
// 这个例子没懂,很奇怪
class ClassAA {
isA: boolean = true
funA() {}
}
class ClassBB {
isB: boolean = true
funB() {}
}
class ClssAB implements ClassAA, ClassBB {
isA: boolean = false
isB: boolean = false
funA(): void {
}
funB(): void {
}
constructor() {
}
}
function mixins (base: any, from: any[]) {
from.forEach((fromItem) => {
Object.getOwnPropertyNames(fromItem.prototype).forEach((key) => {
console.log(key)
base.prototype[key] = fromItem.prototype[key]
})
})
}
mixins(ClssAB, [ClassAA, ClassBB])
let ab = new ClssAB()
console.log(ab)
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
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