版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caishu1995/article/details/86506730
[Mixin 是一种JS实现多继承方式,它通过复制其他类原型链(prototype)上的方法到自身原型链(prototype)上,来实现多继承。]
[节选自https://www.cnblogs.com/zaohe/archive/2012/10/22/js.html]
mixin存在两种形式,一种是类形式的,一种是函数形式的。
类形式的mixin
var baseClass = {
aa: function() {
return "aa";
},
}
相当于基类,通过extend复制给其他的子类,供子类使用。
function extend(receivingClass, givingClass) {
//给receivingClass.prototype(原型)添加内容
for(var methodName in givingClass) {
if(givingClass.hasOwnProperty(methodName)) {
receivingClass.prototype[methodName] = givingClass[methodName];
}
}
}
调用的时候
var childClass = function (bb) {
this.bb = bb;
}
extend(childClass, baseClass);
var obj = new childClass(3);
obj.aa();//如果要使用父类的东西,直接调用
如果修改了对象内容就会变成
注意:上面的extend方法仅是简单的复制了,并不是克隆
函数形式的mixin
var baseClass = function (options) {
this.aa = function(){
return options.aa;
};
}
直接通过call克隆给子类。
var childClass = function (bb) {
this.bb = bb;
}
baseClass.call(childClass.prototype);
这个还有个好处是可以保留一些参数,比如下面
baseClass.call(childClass.prototype, {aa: 2});
var obj = new childClass(3);
obj.aa(); //2
书上提到了优化建议,建议mixin能够添加缓存机制,不要每次都执行函数
var baseClass = (function () {
function aa(){
return options.aa;
}
return function(){
this.aa = aa;
return this;
}
})()
(最常见的集成模式)