继承总结(创造对象、原型链、组合继承、 寄生组合式继承)

 创造对象:

  工厂模式: 

    function createPerson(name,age){

                var  o=new Object();

              o.name=name;

            o.age=age;

                   o.sayName=function(){

                          console.log(this.name)

                   }

return   o;

}

var person1= createPerson('Owen',28);

 

构造函数模式:

fucntion Person(name,age){

    this.name=name;

    this.age=name;

    this.sayName=function(){ console.log(this.name)}

}

var person1=new Person('Owen',28);

 

原型模式:

 function Person(){}

   Person.prototype.name="owen";

   Person.prototype.age=28;

   Perspn.prototype.sayName=function(){console.log(this.name)}

原型链的基本概念:

一、首先理解构造函数、原型、实例的关系:

    1、 每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针 :

                       如一个构造函数Person;    Person.prototype指向原型对象,Person.prototype.constructor指回了Person

    2、 而实例包含一个指向原型对象的内部指针:

                     实例 person1.[[Prototype]]指向Person.prototype ,这个[[Prototype]]是无法访问的,Person.prototype.isPrototypeOf(person1) ,返回true,谷歌可用person1.__proto__指向Person.prototype

 二、原型链的形成:

    如果让原型对象指向另一个类型的实例,那原型对象则会包含一个指向另一个原型的指针,相应的,另一个原型也函数指向另一个构造函数的指针,如果另一个原型又指向另一个类型的实例,如此层层递进,则构成实例与原型的链条

 组合继承:借用构造函数与原型链组合,但会两次调用父类 (这种继承模式使用最多)

 function SuperType(name){

       this.name=name;

      this.color=['red','yellow','blue']

  }

 SuperType.prototype.sayName=function(){

    console.log(this.name) 

}

function SubType(name,age){

   SuperType.call(this,name);  // 第二次调用SuperType()

    this.age=age;

}

SubType.prototype=new SuperType(); // 第一次调用SuperType()

SubType.prototype.constructor=SubType(); 

SubType.prototype.sayAge= function(){

   console.log(this.age);

}

寄生组合式继承:在组合继承上,优化(创建了一个副本,解决二次调用父类的问题)

 function inheritPrototype(subType,superType){

   var prototype = object(superType.prototype); //创建对象 ,其实 就只作了一个 父类的 副本,这样避免二次调用父类

    prototype.constructor=subType; //增强对象

   subType.prototype=prorotype; //指定对象

}

    function SuperType(name){

       this.name=name;

      this.color=['red','yellow','blue']

  }

 SuperType.prototype.sayName=function(){

    console.log(this.name) 

}

function SubType(name,age){

   SuperType.call(this,name);  // 调用SuperType() 一次

    this.age=age;

}

inheritPrototype(SubType,SuperType);

SubType.prototype.sayAge= function(){

   console.log(this.age);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值