Javascript继承实现方式

1.对象冒充方式:
  a.能够实现多继承
  b.子类的新属性及新方法必须在父类对应的临时方法执行及删除后才能够添加,否则会被父类覆盖。
  c.只能继承通过构造函数this.方式定义的属性及方法,不能继承通过原型方式prototype.定义的属性及方法
  d.不能使用instanceof来检验子类对象与父类的关系。
function ClassA(){
   this.prop1 = "aaaa";
   ...
   this.method1 = function(){...};
};
ClassA.prototype.method2 = function(){
   ....
};
function ClassB(){
   this.tempMethod = classA;
   this.tempMethod();
   delete this.tempMethod;


   this.propb = "asdf";
};
var obj = new ClassB();
obj.prop1 = "asdf";  //ok
obj.propb = "asdfa"; //ok
obj.method1();  //ok
obj.method2();  //error




2.call方式:针对对象冒充方式设置的一个函数,为了简化其实现,所以优缺点完全如同1.
function ClassA(val1,val2){
    this.prop1 = val1;
    this.prop2 = val2;
    ....
    this.method1 = function(){...};
};
function ClassB(val1,val2,valb){
  //this.tempMethod = classA;
  //this.tempMethod();
  //delete this.tempMethod;
  ClassA.call(this,val1,val2);
  this.propb = valb;
};


3.apply方式:call方式的一个变形用法,唯一的区别是call方式可以自由传递参数而apply只能传递一个参数数组或者arguments本身,参数数组或者arguments本身的顺序必须与方法的参数顺序一致。


4.原型链方式:
  a.解决对象冒充方式不能继承父类通过原型prototype方式定义的方法及属性。
  b.父类属性方法不管是用构造函数this.定义还是原型方式定义都能被子类继承到。
  c.子类的通过原型方式定义的属性及方法必须在ChildClass.prototype = new ParentClass();语句后定义,否则会被清空。
  d.支持instanceof方法
  e.不支持多重继承。
  f.原型链继承方式的缺陷:父类构造函数必须没有参数且不能实现多种继承。
function ClassA()
{
    this.prop1 = "aaa";
    ...
}


ClassA.prototype.method1 = function(){....};


function ClassB(){
   this.propB = "bbb";
   ...
}


ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};


var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok




5.混合方式:集合对象冒充方式及原型链方式来解决父类构造方法没有参数的缺陷,是比较完美的继承解决方案。
function ClassA(val1,val2)
{
    this.prop1 = val1;
    this.prop2 = val2;
    ...
}


ClassA.prototype.method1 = function(){....};


function ClassB(val1,val2,valb){
   ClassA.call(this,val1,val2);
   this.propB = valb;
   ...
}


ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};


var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok

你可能感兴趣的:(Javascript继承实现方式)