//1、借用式继承   把sup的构造函数里的属性方法克隆一份sub实例对象
    function Super(){
      this.val = 1;
      this.fun1 = function(){console.log('fun1')};
    }
    Super.prototype.name = "name";
    Super.prototype.fun2 = function(){console.log('fun2')};
 
    function Sub(){
      Super.call(this);
    }
 
    var sub1 = new Sub();
    var sub2 = new Sub();
 
    console.log(sub1.fun1 === sub2.fun1);
    console.log(sub1.val);
    console.log(sub1.name);
    sub1.fun1();                   
 
    //2、原型式继承    把Super的实例对象拿作Sub构造函数的原型属性
    function Super(){
      this.val1 = 1;
      this.fun1 = function(){console.log(1)};
    }
    var pro = new Super();
 
    function Sub(){}
    Sub.prototype = pro;
 
    var sub1 = Sub();
 
 
    //3、寄生式   sub实例化对象新增了自己的属性方法,并且把Super的实例对象拿作Sub构造函数的原型属性
    function Super(){
      this.val1 = 1;
      this.fun1 = function(){console.log(1)};
    }
    Super.prototype.val2 = 2;
    Super.prototype.fun2 = function(){console.log(2)};
 
    function Sub(){
    }
    Sub.prototype = new Super();
 
    var sub1 = new Sub();
    sub1.attr1 = 1;
    sub1.attr2 = 2;
 
 
    //4、组合式继承   把sup的构造函数里的属性方法克隆一份sub实例对象,并且把Super的实例对象拿作Sub构造函数的原型属性
    function Super(){
      this.val1 = 1;
      this.fun1 = function(){console.log(1)};
    }
    Super.prototype.val2 = 2;
    Super.prototype.fun2 = function(){console.log(2)};
 
    function Sub(){
      Super.call(this);
    }
    Sub.prototype = new Super();
 
    var sub1 = new Sub();
    var sub2 = new Sub();
 
    console.log(sub1);
    console.log(sub1.fun1 === sub2.fun1);
    console.log(sub1.fun2 === sub2.fun2);
 
 
 
    //5、寄生组合式     Sub构造函数的原型属性是第三个构造函数(它的原型为Sup的原型,但是没有Sup构造函数里的属性方法)的实例对象,把sup的构造函数里的属性方法克隆一份sub实例对象
    function beget(obj){   // 生孩子函数 beget:龙beget龙,凤beget凤。
    var F = function(){};
    F.prototype = obj;
    return new F();
    }
 
    function Super(){
        // 只在此处声明基本属性和引用属性
        this.val = 1;
        this.arr = [1];
    }
    //  在此处声明函数
    Super.prototype.fun1 = function(){};
    Super.prototype.fun2 = function(){};
    //Super.prototype.fun3...
 
    function Sub(){
        Super.call(this);   // 核心
        // ...
    }
    var proto = beget(Super.prototype); // 核心
    proto.constructor = Sub;            // 核心
    Sub.prototype = proto;              // 核心
 
    var sub = new Sub();
    alert(sub.val);
    alert(sub.arr);

js中5中继承方式分析的更多相关文章

  1. js的6种继承方式

    重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...

  2. 细说 js 的7种继承方式

    在这之前,先搞清楚下面这个问题: function Father(){} Father.prototype.name = 'father'; Father.prototype.children = [ ...

  3. c++中三种继承方式的区别

    public公有继承 protected保护继承 private私有继承 我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用. 公有继承时 ...

  4. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  5. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  6. 重新理解JS的6种继承方式

    写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...

  7. js的5种继承方式——前端面试

    js主要有以下几种继承方式:对象冒充,call()方法,apply()方法,原型链继承以及混合方式.下面就每种方法就代码讲解具体的继承是怎么实现的. 1.继承第一种方式:对象冒充 function P ...

  8. js的几种继承方式

    1.原型链方式 function Super(){ this.val = 1; this.arr = [1]; } function Sub(){ // ... } Sub.prototype = n ...

  9. Loadrunner中参数化取值方式分析

    Loadrunner中参数化取值依赖两个维度: 1.取值顺序分为“顺序”“随机”“唯一”.    select next row:Sequential , Random,unique 2.更新值时分为 ...

随机推荐

  1. 【411】COMP9024 Assignment1 问题汇总

    1. 构建 Makefile 文件后运行错误,undefined reference to 'sqrt' 实际上是没有链接math数学库,所以要 $gcc test.c –lm //-lm就是链接到m ...

  2. 【原创】Elasticsearch无宕机迁移节点

    官方API文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-filtering.html 参考 ...

  3. P4055 [JSOI2009]游戏

    传送门 把这个图给黑白染色然后建二分图,如果有完备匹配那么就gg,否则放在所有的非匹配点都可以 简单来说的话就是放在非匹配点,那么对手的下一步必定移到一个匹配点,然后自己可以把它移到这个匹配点所匹配的 ...

  4. [App Store Connect帮助]七、在 App Store 上发行(4)分阶段发布某个版本更新(iOS 和 watchOS)

    当您发布您 App 的一个版本更新时,您可以选择分阶段发布您的 iOS App.如果您正在提交一个 iOS 版本更新,且您的 App 处于以下 App 状态之一,则此选项可用. 准备提交 正在等待审核 ...

  5. Tech 助力Fin ,大数据风控系统赋能掌众金服!

    胡亚海 首席技术官  CTO 北京航空航天大学  博士 深耕互联网领域近20年,先后任职于普天信息技术研究院.摩托罗拉.宇龙酷派.百度等知名企业,曾主导宇龙酷派公司全员从WinCE向Android转型 ...

  6. Python圈中的符号计算库-Sympy(转载)

    <本文来自公众号“大邓带你玩python”,转载> import math math.sqrt(8) 2.8284271247461903 我们看看Python中结果 math.sqrt( ...

  7. 数论(GCD) HDOJ 4320 Arcane Numbers 1

    题目传送门 题意:有一个A进制的有限小数,问能否转换成B进制的有限小数 分析:0.123在A进制下表示成:1/A + 2/(A^2) + 3 / (A^3),转换成B进制就是不断的乘B直到为0,即(1 ...

  8. Oracle10g初探DBCA

    Database Configuration Assistant. [oracle@dbsrv3 bin]$ pwd /opt/oracle//bin [oracle@dbsrv3 bin]$ ./d ...

  9. 积分图像的应用(一):局部标准差 分类: 图像处理 Matlab 2015-06-06 13:31 137人阅读 评论(0) 收藏

    局部标准差在图像处理邻域具有广泛的应用,但是直接计算非常耗时,本文利用积分图像对局部标准差的计算进行加速. 局部标准差: 标准差定义如下(采用统计学中的定义,分母为): 其中. 为了计算图像的局部标准 ...

  10. ORA-00020: maximum number of processes (300) exceeded

    SQL> select count(*) from v$session; COUNT(*)---------- 98 SQL> select count(*) from v$process ...