Mixin模式

介紹

mixin模式就是一些提供能夠被一個或者一組子類簡單繼承功能的類,意在重用其功能。在面向對象的語言中,我們會通過接口繼承的方式來實現功能的複用。但是在javascript中,我們沒辦法通過接口繼承的方式,但是我們可以通過javascript特有的原型鏈屬性,將功能引用複製到原型鏈上,達到功能的注入。

代碼實現

    function Mixin(recClass, giveClass) {
        if (arguments.length > 2) {
            for (let i = 2; i < arguments.length; i++) {
                recClass.prototype[arguments[i]] = giveClass.prototype[arguments[i]];
            }
        } else {
            for (let property in giveClass.prototype) {
                recClass.prototype[property] = giveClass.prototype[property];
            }
        }
    };

實例

    function Car(name, speed){
        this.name = name;
        this.speed = speed;
    }

    Car.prototype.now = function() {
        console.log(this.name,this.speed);
    }

    Car.prototype.limit = function() {
        console.log('speed limit 120km/h')
    }

    Car.prototype.drive = function() {
        console.log('Car can drive');
    }

    function Future() {

    }

    Future.prototype.fly = function() {
        console.log('Car can fly in future');
    }
    
    Future.prototype.limit = function() {
        console.log('speed not limit');
    }

    var car = new Car('ferrari', 80);
    car.now();
    car.limit();
    car.drive();

    Mixin(Car, Future);

    var carFuture = new Car('future', 200);
    carFuture.now();
    carFuture.limit();
    carFuture.drive();
    carFuture.fly();

    //=>
    // ferrari 80
    // speed limit 120km/h
    // Car can drive

    // future 200
    // speed not limit
    // Car can drive
    // Car can fly in future
    Mixin(Car, Future, 'fly');
    var car = new Car('ferrari', 80);
    car.now();
    car.limit();
    car.drive();

    Mixin(Car, Future);

    var carFuture = new Car('future', 200);
    carFuture.now();
    carFuture.limit();
    carFuture.drive();
    carFuture.fly();

    //=>
    // ferrari 80
    // speed limit 120km/h
    // Car can drive

    // future 200
    // speed limit 120km/h
    // Car can drive
    // Car can fly in future    

優缺比較

Mixin支持在一個系統中降解功能的重複性,增加功能的重用性.在一些應用程序也許需要在所有的對象實體共享行爲的地方,我們能夠通過在一個Mixin中維護這個共享的功能,來很容易的避免任何重複,而因此專注於只實現我們系統中真正彼此不同的功能。

也就是說,對Mixin的副作用是值得商榷的.一些開發者感覺將功能注入到對象的原型中是一個壞點子,因爲它會同時導致原型污染和一定程度上的對我們原有功能的不確定性.在大型的系統中,很可能是有這種情況的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章