在JavaScript中使用mixin

mixin:多重继承,也称为extend

mixin(混合)的本质就是将一个对象的属性拷贝到另一个对象上,其实就是对象的融合。

Q: 这个和原型链的继承有什么区别?
A: mixin是直接在混合后的对象本身的属性上查找的,而不是在prototype上查找的

Q: 这个和Object.assigin()有什么区别?
A: 虽然Object.assigin()也在对象属性进行合并,但Object.assigin()不会复制原型链上的属性,
而mixin会将原型链上的属性一并复制过去(for … in …)

demo:

1
2
3
4
5
6
7
8
9
10
// mixin.js
export default mixin (source, target) {
for (let key in source) {
if (source[key] !== target[key]) {
target[key] = source[key];
}

return target;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// index.js
import mixin from 'mixin';

const Book = {
type: 'book',
log () {
console.log(this);
}
};

const Tech_book = mixin (Book, {
name: 'tech_book',
log () {
Book.log.call(this);
}
});

Tech_book.log();
// this: {
type: 'book',
name: 'tech_book',
log: f log()
}

注: mixin.js 扩展参数的写法:

1
2
3
4
5
6
7
8
9
// mixin.js
export default mixin (...objs) {
return objs.reduce((dest, src) => {
for (var key in src) {
dest[key] = src[key]
}
return dest;
});
};