[javascript高手之路]寄生组合式继承的优势

在之前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

其实,说白了寄生组合式继承就是一个借用构造函数 + 相当于浅拷贝父类的原型对象

时间: 2024-11-08 23:07:28

[javascript高手之路]寄生组合式继承的优势的相关文章

[js高手之路]寄生组合式继承的优势

在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: 1 function Person( uName ){ 2 this.skills = [ 'php', 'javascript' ]; 3 this.userName = uName; 4 } 5 Person.prototype.showUserName = function(){ 6 return this.userName; 7 } 8 function Teacher ( uName

JavaScript高级程序设计之寄生组合式继承

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://read.qidia

JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype = new 父类型();”,实现方法如下

javascript寄生组合式继承

下面是javascript寄生组合式继承源代码,选自这里.讲解请见我所加注释: function creatObject(o){//该函数是为了创建原型链对象所用,传入值o为一个function F(){}//新建函数 F.prototype = o;//设置该函数的原型属性为传入对象 return new F();//调用该函数后返回链式对象F.prototype=o; } function inheritPrototype(subType, superType){//用于设置对象属性 var

JavaScript寄生组合式继承分析

JavaScript寄生组合式继承特点: 避免了在子类prototype上创建不必要多余的属性,相比直接继承基类的实例效率要高. 是JavaScript 实现继承的最有效方式. <script> //定义基类构造函数和属性 function BaseClass(name,age){ this.name=name; this.age=age; } //在基类原型上添加sayName方法 BaseClass.prototype.sayName=function(){ console.log(thi

[js高手之路]原型式继承与寄生式继承

一.原型式继承本质其实就是个浅拷贝,以一个对象为模板复制出新的对象 1 function object( o ){ 2 var G = function(){}; 3 G.prototype = o; 4 return new G(); 5 } 6 var obj = { 7 name : 'ghostwu', 8 age : 22, 9 show : function(){ 10 return this.name + ',' + this.age; 11 } 12 }; 13 var obj2

JavaScript中的继承之寄生组合式继承

先说说组合继承.最常用的继承方式组合继承,其最大的问题是无论在什么情况下,都会调用两次超类型的构造函数:一次是在创建子类原型的时候,另一次是在子类型构造函数内部. 组合继承是通过原型继承方法和原型属性,构造函数继承实例属性.但子类通过原型也继承了超类型的全部实例属性(方法暂且不说),即超类的实例属性成为子类的原型属性,所以不得不在调用子类构造函数时重写这些属性.也就是说在子类的原型对象上继承来自超类的实例属性完全是多余的. 看一个组合继承的例子. function SuperType(name)

javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承

组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承,原型继承又与类式继承差不多,所以另外一种继承模式应该是构造函数继承.当然子类不是父类的实例的问题是由于类式继承引起的. 说道这,我不得不说一下,道格拉斯大哥对寄生式继承的改造 function inheritPrototype(subClass,superClass){ //复制一份父类的原型副本保

JavaScript之原型式继承&amp;寄生式继承和寄生组合式继承以及优缺点

一.原型式继承 1.这种方法并没有使用严格意义上的构造函数,借助原型可以基于已有的对象创建新的对象 function object(o) { function F() {} F.prototype = o; return new F(); } // 在object()函数内部,先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数原型,最后返回了这个临时类型的一个新实例. // object()本质上对其中传入的对象进行了一次浅复制 // 看如下的例子: var person = { na