//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);

最新文章

  1. Android热修复AndFix
  2. Python的垃圾回收机制
  3. iStylePDF c#集成开发示例
  4. laravel Ajax post方式的使用
  5. 将webkit内核封装为duilib的浏览器控件
  6. [原]基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息
  7. 5. Effective Java 第三版——使用依赖注入取代硬连接资源
  8. WebApi的多版本管理
  9. Codeforces 671 D. Roads in Yusland
  10. selemium 常用查找方法
  11. 2016年 CodePen 最热门的前端代码 Top 100
  12. 如何用 Python 模糊搜索文件
  13. centos6.8 固定IP
  14. IDEA run下output标签悬浮/弹出状态
  15. Python 语法提示vim配置
  16. 函数和常用模块【day06】:datetime模块(二)
  17. RabbitMQ -- unacked
  18. HihoCoder - 1807:好的数字串 (KMP DP)
  19. 集成学习算法总结----Boosting和Bagging
  20. 重学C语言---02C语言概述

热门文章

  1. vue tab切换demo
  2. css3 混合模式mix-blend-mode background-blend-mode 以及混合模式的隔断 isolation
  3. Java位运算(移位,位与,或,异或,非)
  4. E20170520-ts
  5. SS上网配置(Window 7/8/10 )详解
  6. [POI2007]石头花园SKA
  7. Service官方教程(8)Bound Service示例之2-跨进程使用Messenger
  8. 有关LD_LIBRARY_PATH与ld.so.conf
  9. hdu 1430 魔板 康托展开 + 很好的映射
  10. D. Alyona and a tree 公式转换 + 分块暴力