JavaScript-mixin實現多繼承

mixin簡單通俗的講就是把一個對象的方法和屬性拷貝到另一個對象上,注意這個繼承還是有區別的。js是一種只支持單繼承的語言,畢竟一個對象只有一個原型,如果想實現多繼承,那就簡單暴力的把需要繼承的父類的所有屬性都拷貝到子類上,就是使用mixin啦。

下面所有代碼可以到github上查看完整版。

一個簡單的mixin

直接上代碼

        function extend(destClass, srcClass) {
            var destProto = destClass.prototype;
            var srcProto  = srcClass.prototype;
            for (var method in srcProto) {
                if (!destProto[method]) {
                    destProto[method] = srcProto[method];
                }
            }
        }

        function Book(){}
        Book.prototype.printName = function(){
            console.log('I am a book, named hello');
        };

        function JS(){}

        extend(JS, Book);
        var js = new JS();
        console.log(js);

這裏寫圖片描述

現在你應該大概瞭解mixin在做什麼。

可以僅僅拷貝某些方法:

        function extend(destClass, srcClass, methods) {
            var srcProto  = srcClass.prototype;
            var destProto = destClass.prototype ;   
            for (var i=0; i<methods.length; i++) {
                var method = methods[i];
                if (!destProto[method]) {
                    destProto[method] = srcProto[method];
                }
            }
        }
        function Book() {}
        Book.prototype.getName = function() {};
        Book.prototype.setName  = function() {};

        function JS() {}

        extend(JS, Book, ['getName']);
        var js = new JS();
        console.log(js);

這裏寫圖片描述

mixin實現多繼承

直接上代碼。

        function extend(destClass) {
            var classes = Array.prototype.slice.call(arguments, 1);
            for (var i=0; i<classes.length; i++) {
                var srcClass = classes[i];
                var srcProto  = srcClass.prototype;
                var destProto = destClass.prototype;  
                for (var method in srcProto) {
                    if (!destProto[method]) {
                        destProto[method] = srcProto[method];
                    }
                }      
            }
        }
        function Book() {}
        Book.prototype.getName = function() {};
        Book.prototype.setName  = function() {};

        function Tech(){}
        Tech.prototype.showTech = function(){};

        function JS() {}

        extend(JS, Book, Tech);
        var js = new JS();
        console.log(js);

這裏寫圖片描述

總結

很多前端庫裏都有mixin方法,只是叫法不一樣,比如 jQuery的extend,文中我們實現的都是淺拷貝,jQuery中的extend可以實現深拷貝。很多庫會使用mixin的方式,將一些工具方法擴展到相應對象中,實現代碼複用。

發佈了82 篇原創文章 · 獲贊 82 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章