mixin 多继承-1.1

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();//如果要使用父类的东西,直接调用

1如果修改了对象内容就会变成2

    注意:上面的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

call

    书上提到了优化建议,建议mixin能够添加缓存机制,不要每次都执行函数

var baseClass = (function () {
    function aa(){
        return options.aa;
    }
    
    return function(){
        this.aa = aa;
        return this;
    }
})()

    (最常见的集成模式)

猜你喜欢

转载自blog.csdn.net/caishu1995/article/details/86506730