类式继承

学习了几种继承的模式,但是还是对于其实际运用还不是很了解,如有对其比较了解的,希望能够指导指导。

默认继承

  function Parent(name){

    this.name=name||'ad';

  }

  Parent.prototype.say=function(){

    return this.name;

  }

  function Child(name){}

  inherit(Child,Parent);

  function inherit(C,P){

    C.prototype=new P();//原型属性应该指向一个对象,而不是一个函数因此它必须指向一个由父构造函数所创建的实例(一个对象) 

  }

 

  当使用一个new Child()语句创建一个对象时,它会通过原型从Parent()实例中获取它的对象。

  var kid=new Child();

  kid.say();   //ad 

   在子对象上添加属性后 

  var kid=new Child();

  kid.name='other';

  kid.say();   //other 

特点或者说是缺点:同时继承 了添加到this的属性和原型上的属性,不支持将参数传递到父构造函数(new Child('anthoer').say();//ad)

 

借用构造函数

  function Parent(){

    this.name=['html'];

  }

  var  oParent=new Parent();

  function Blog(){}

  Blog.prototype=oParent;

  var child=new Blog();

  function Page(){

    Parent.call(this);  

  }

  var otherChild=new Page();

  oParent.hasOwnProperty('name');    //true

  child.hasOwnProperty('name');         //false

  otherChild.hasOwnProperty('name'); //true

  //child对象通过原型获得name属性,并没有将oParent作为自身的属性,所以返回false。

     //otherChild对象本身具有一个name属性,因为在借用构造函数的时候,新对象会获得父对象中的tags成员的副本(不是引用)

  blog.name.push('css');

  otherChild.name.push('php');

  alert(oParent.name.join(','));//html,css  由于otherChild.name和oParent.name指向同一个数组。

   

  function Parent(name){   //父构造函数

    this.name=name||'ad';

  }

  Parent.prototype.say=function(){

    return this.name;

  }

     funcion Child(name){   //子构造函数

    Parent.call(this,arguments);

  }

      var oChild=new Child('bd');

      oChild.name;//bd

  typeof oChild.say;//undefined

 

 

优缺点:当使用借用构造函数时可以借用多个构造函数;无法获取原型的属性,   可以获得父对象自身的真实副本,则不会存在子对象意外覆盖父对象属性的风险

 

借用和设置原型 

      function Parent(name){   //父构造函数

    this.name=name||'ad';

  }

  Parent.prototype.say=function(){

    return this.name;

  }

     funcion Child(name){   //子构造函数

    Parent.call(this,arguments);

  }

  Child.prototype=new Parent();

      var oChild=new Child('bd');

      oChild.name;     //bd
      oChild.say();     //bd

      delete oChild.name;

   oChild.name;     //ad
      oChild.say();     //ad

 

优:可以获得父对象本身的成员副本以及指向父对象中可复用功能

缺:父构造函数被调用两次,自身属性会被继承两次

 

共享模型

  function inherit(C,P){

    C.prototype=P.Prototype;
  }

 

只能继承原型中的属性,所以需要把要继承的东西放在原型中

优:不涉及任何父构造函数的调用,简短而迅速的原型链查询

缺:在继承链下方的任何子对象或孙对象都能够修改原型,

 

临时构造函数

function inherit(C,P){

  var F=function(){}

  F.prototype=P.prototype;

  C.prototype=new F();

}

 

断开了父对象与子对象的原型之间的直接链接关系,解决了共享模式的子对象修改父对象原型属性的问题,不过也只继承了原型的属性。

 

  

    

 

 

你可能感兴趣的:(类式继承)