本文是原创文章,如需转载,请注明文章出处

1.js中实现组合继承(B继承A):

function A(name){
this.name = name;
this.ary = ["AA","BB","CC"];
} A.prototype.say = function()
{
console.log(this.name);
console.log(this.ary);
} function B(name, age){
A.call(this, name);    //第二次调用
this.age = age;
} B.prototype = new A();    //第一次调用
B.prototype.constructor = B; function main(){
  var b = new B("Nick", 30);
  b.say();
}

这种继承方式主要是利用原型链实现继承,同时使用构造函数传入参数,每当生成B对象时,会调用A的构造函数添加name和ary属性从而实现继承。

但这种方式有个缺陷,会调用2次A的构造函数,第一次是在设置prototype时,此时B.prototype指向一个A的实例,实例中保存着一份name和ary;第二次是在生成B对象时,B的构造函数会调用A的构造函数,在B对象中添加name和ary属性,当访问B对象属性时,发现B对象中有name和ary,所以返回的值是我们所期望的。

2.寄生组合式继承(B继承A):

function inherit(B, A){
var prototype = object(A.prototype);
B.prototype = prototype;
prototype.constructor = B;
} function object(o){
function F(){};
F.prototype = o;
return new F();
} function A(name){
this.name = name;
this.ary = ["AA", "BB", "CC"];
} A.prototype.sayName = function()
{
console.log(this.name);
} function B(name, age){
A.call(this, name);
this.age = age;
} inherit(B, A); B.prototype.sayAge = function()
{
console.log(this.age);
} function main(){
var instance = new B("Nick", 30);
instance.sayName();    //"Nick"
instance.sayAge();    //30
}

这种继承方式跟第一种很相似,区别就是使用了inherit方法,首先创建A原型的一个副本,然后将因重写原型而失去的constructor指向B,最后将新创建的原型副本赋值给B的原型。

这种方式的好处就是不会调用两次父超类型的构造函数,不用创建多余属性。

js组合继承和寄生组合式继承比较的更多相关文章

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

    在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...

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

    说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...

  3. 详解js中的寄生组合式继承

    寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上.       2. ...

  4. 寄生组合式继承 js

    寄生组合式继承是集寄生式继承和组合继承的优点于一身,是基于类型继承最有效的方式 function object(o){ function F(){}; F.prototype = o; return ...

  5. js寄生组合式继承

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

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

    组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承, ...

  7. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  8. JavaScript对寄生组合式继承的理解

    有关JavaScript的几种继承方式请移步JavaScript的几种继承方式 原型链的缺陷 SubType.prototype = new SuperType(); 这样做的话,SuperType构 ...

  9. javascript中的继承-寄生组合式继承

    前文说过,组合继承是javascript最常用的继承模式,不过,它也有自己的不足:组合继承无论在什么情况下,都会调用两次父类构造函数,一次是在创建子类原型的时候,另一次是在子类构造函数内部.子类最终会 ...

随机推荐

  1. PMP考试

    今天是第二次PMP模拟考试,得了146分,比上次高25分,这次题目相对简单些,看来昨晚的复习没有白费,还是有效果的. 有些题目影响还是比较深刻,老外的项目管理思想是先规划好一切再执行(管理),比如信息 ...

  2. Android 颜色渲染PorterDuff及Xfermode详解

    在讲具体的使用之前补充一点知识,这就是 ProterDuff的由来: 相信大多数人看到这个ProterDuff单词很奇怪了吧,这肿么个意思呢,然后就用有道啊,金山啊开始翻译,但是翻译软件给出的结果肯定 ...

  3. 罗技 UE3100 蓝牙耳机使用

    罗技 UE3100 蓝牙耳机使用内置麦克风 蓝牙2.1蓝牙功能 和 手机 .平板 . 电脑 连接.开关 长按 5秒 开机 指示灯变成绿色并闪烁 此时耳机处于待蓝牙设备搜索状态当 智能手机 搜索 蓝牙设 ...

  4. u-boot移植 II

    下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...

  5. VS2013 添加已有文件夹

    1.将现有项目或文件夹拷贝到指定目录下 2.解决方案右上有个显示所有文件的按钮 然后选中所有要添加的文件,右击

  6. Android从assets目录下读取文件相关

    有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行.而美工不配合转换成图片,前端没时间把word写成html 没办法,自己搞. 步骤: 1. ...

  7. c#DataGridView数据绑定示例——格式化单元格的内容(转)

    转自http://blog.csdn.net/testcs_dn/article/details/37834063 c#DataGridView数据绑定示例 格式化单元格的内容 在使用DataGrid ...

  8. AES 与Base64加密

    public class AESHelper     {         /// <summary>         /// 获取密钥         /// </summary&g ...

  9. Java程序的编码规范

    所有的程序开发手册都包含了各种规则.一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的.这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑. 一.命名 ...

  10. selenium启动Chrome浏览器和禁止证书错误提示弹出

    要把ChromeDriver放到代码中的文件夹中c://*******Application public static WebDriver WebDriverRun(WebDriver driver ...