1、实现继承:原型链
        function extend1() {//父类型
          this.name = "张三";
        }
        function extend2(){ //子类型
          this.age =18;
        }
        extend2.prototype = new extend1();//extend2继承了extend1中的属性
       (父类型的实例化对象赋值给子类型的原型属性,父类型中的构造函数和原型信息都会给extend2)
        var _extend1 = new extend2();
        console.log(_extend1.name);//张三
        console.log(_extend1.age);//18
  function extend3() {
          this.address = "重庆";
        }
        extend3.prototype = new extend2();//extend3继承了extend1和extend2
        var _extend2 = new extend3();
        console.log(_extend2.name);//张三
        console.log(_extend2.age);//18
        console.log(_extend2.address);//重庆
        
    extend1.prptotype.name = "lucy";
    var _extend1 = new extend1();
    console.log(_extend1.name);//张三  就近原则,现在实例里面找,有就返回,没有才去原型里面找
   子类型从属于自己或他的超类型(父类型)
    alert(_extend2.instanceof Object);//true 
    alert(_extend2.instanceof extend2);//true 
    alert(_extend2.instanceof extend1);//true 
2、组合继承
  function Group1(age) {
          this.name = ["Linda",'Bob','Lucy','Anna'];
          this.age = 25;
        }
 构造函数里的方法放在构造里每次实例化都会分配一个内存地址(浪费),放在原型里保证每次实例化都只有一个引用地址:
        Group1.prototype.run = function () {
          return this.name + ',' + this.age;
        }
        function Group2(age) {
          Group1.call(this,age);//对象冒充只能继承构造实例中的,不能继承原型中的信息
        }
        Group2.prototype = new Group1();//原型链继承,否则原型里的run方法是访问不到的
        var _group1 = new Group2(20);
        console.log(_group1.run());

3、原型式继承
1. 临时中转函数
  function obj (o) {//o表示杨要穿ID进的一个对象
     function F(){};//F构造函数是一个临时新建的对象,用于存储传过来的对象
     F.prototype = o; //jiango对象实例赋值给F构造函数的原型对象
     return new F(); //返回这个得到传递过来对象的对象实例
  }
2. 字面量的声明方式(相当于 var box = new Box();)
 var box= {
   name:"Lucy",
   age :100
 }
F.prototype = 0;//
 var box1 = obj(box);box1就等于 new F();
 alert(box1.name);//lucy
4、寄生式继承=原型式+工厂模式
1. 临时中转函数
  function obj (o) {//o表示杨要穿ID进的一个对象
     function F(){};//F构造函数是一个临时新建的对象,用于存储传过来的对象
     F.prototype = o; //jiango对象实例赋值给F构造函数的原型对象
     return new F(); //返回这个得到传递过来对象的对象实例
  }
//寄生函数
function create(o){
   var f = obj(o);
   f.run = function(){
     return this.name + "方法";
   }
   return f;
}
 var box= {
   name:"Lucy",
   age :100
 }
var box1 = create(box);
alert(box1.run());//lucy方法
5、寄生式组合继承(最终完美版本)
1. 临时中转函数
  function obj (o) {//o表示杨要穿ID进的一个对象
     function F(){};//F构造函数是一个临时新建的对象,用于存储传过来的对象
     F.prototype = o; //jiango对象实例赋值给F构造函数的原型对象
     return new F(); //返回这个得到传递过来对象的对象实例
  }
2.寄生函数
  function create(box,desk){
   var f = obj(box.prototype);
   desk.prototype = f;
   return f;
}
3.构造函数
function Box(name,age){
  this.name = name;
  this.age = age;
]
4.原型式方法
Box.prototypr.run = function(){
    return this.name + this.age + "运行中..."
 }
5.对象冒充
function Desk(name,age){
   Box.call(this,name,age);
 }
6.通过寄生组合继承来实现继承
create(Box,Desk);//用于替代 Desk.prototype = new Box();

最新文章

  1. 洛谷P2412 查单词 [trie树 RMQ]
  2. C#软件设计——小话设计模式原则之:单一职责原则SRP
  3. 梦想成真,喜获微软MVP奖项,微软MVP FAQ?
  4. SQL Server代理(10/12):使用代理账号运行作业
  5. SoundCloud 的开发功能
  6. GitHub for Windows离线安装的方法
  7. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)
  8. 教程-Delphi多线程数据库查询(ADO)
  9. sequence使用
  10. delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
  11. PHP中将对数据库的操作,封装成一个工具类以及学会使用面向对象的方式进行编程
  12. BFS+状态压缩 HDU1429
  13. AngularJS自定义指令之可选参数replace
  14. 如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍
  15. poj 1948 Triangular Pastures 小结
  16. 基于Spring Boot,使用JPA动态调用Sql查询数据
  17. [HNOI 2004]敲砖块
  18. 使用XStream是实现XML与Java对象的转换(6)--持久化
  19. javascript中数组总结
  20. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T4(模拟)

热门文章

  1. Leetcode908.Smallest Range I最小差值1
  2. PHP基础-生成静态html页面原理是怎样
  3. Linux C socket 基于 UDP
  4. Directx11教程(42) 纹理映射(12)-简单的bump mapping
  5. docker push dial tcp *.*.*.*:443 getsockopt: connection refused
  6. hackerrank---Sets - Symmetric Difference
  7. 【NS2】各种TCP版本 之 TCP Tahoe 和 TCP Reno(转载)
  8. 巨蟒python全栈开发-第11阶段 ansible_project3
  9. python == 符号
  10. SDUT-3441_数据结构实验之二叉树二:遍历二叉树