[javascript高手之路]寄生組合式繼承的優勢

qianby發表於2021-09-09

在之前javascript物件導向系列的文章裡面,我們已經探討了組合繼承和寄生繼承,回顧下組合繼承:

function Person( uName ){            this.skills = [ 'php', 'javascript' ];            this.userName = uName;        }        Person.prototype.showUserName = function(){            return this.userName;        }        function Teacher ( uName ){            Person.call( this, uName );        }        Teacher.prototype = new Person();        var oT1 = new Teacher( 'ghostwu' );        oT1.skills.push( 'linux' );        var oT2 = new Teacher( 'ghostwu' );        console.log( oT2.skills ); //php,javascript        console.log( oT2.showUserName() ); //ghostwu

組合繼承有個缺點,父類的建構函式會被呼叫兩次.

第11行,設定子類原型物件(prototype),呼叫了第一次

第9行,例項化物件的時候,又呼叫一次

建構函式的目的是為了複製屬性,第9行肯定是不能少的,第11行的目的是為了獲取到父類原型物件(prototype)上的方法,基於這個目的,有沒有別的方法

可以做到 在不需要例項化父類建構函式的情況下,也能得到父類原型物件上的方法呢? 當然可以,我們可以採用寄生式繼承來得到父類原型物件上的方法

function Person( uName ){            this.skills = [ 'php', 'javascript' ];            this.userName = uName;        }        Person.prototype.showUserName = function(){            return this.userName;        }        function Teacher ( uName ){            Person.call( this, uName );        }        function object( o ){            var G = function(){};            G.prototype = o;            return new G();        }        function inheritPrototype( subObj, superObj ){            var proObj = object( superObj.prototype ); //複製父類superObj的原型物件            proObj.constructor = subObj; //constructor指向子類建構函式            subObj.prototype = proObj; //再把這個物件給子類的原型物件        }        inheritPrototype( Teacher, Person );        var oT1 = new Teacher( 'ghostwu' );        oT1.skills.push( 'linux' );        var oT2 = new Teacher( 'ghostwu' );        console.log( oT2.skills ); //php,javascript        console.log( oT2.showUserName() ); //ghostwu

其實,說白了寄生組合式繼承就是一個借用建構函式 + 相當於淺複製父類的原型物件

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3549/viewspace-2815863/,如需轉載,請註明出處,否則將追究法律責任。

相關文章