你的位置:首页 > Java教程

[Java教程]JS继承模式粗探


      之前提到了JS中比较简单的设计模式,在各种设计模式中被最常使用的工具之一就是原型链的继承。作为OOP的特质之一——继承,今天主要谈谈JS中比较简单的继承方法。

      最基础的原型链继承在这里就不复述了,主要讲一下其他的继承模式。

1.借用构造函数继承

function Father (name) {  this.name=name;}function Son (name) {  Father.call(this,name); //在子类型中调用超类型的构造函数  this.age=15;}var me=new Son("Su");

好处:可以为子类型传递参数,如图中的name属性。

坏处:1.方法在构造函数中定义,无法复用。2.超类型原型中定义的方法对子类型是不可见的。

2.组合继承(综合原型链与构造函数)

//超类型构造函数
function Father (name) { this.name=name; this.famMember=[];}
//超类型构造函数原型方法Father.prototype.sayName=function () { alert(this.name);}
//子类型构造函数function Son (name,age) { Father.call(this,name); //构造函数方法 this.age=age;}Son.prototype=new Father(); //重写子类型原型对象Son.prototype.constructor=Son; //重写构造函数属性指向子类型Son.prototype.sayAge=function () { alert(this.age);} //重写原型对象后再加入方法var me=new Son("Su",15);me.famMember.push("dad","mom"); //子类型可以调用超类型构造函数内的方法
var he=new Son("Li",14);
alert(he.famMember); // []

好处:不同的子类既可以拥有自己的属性,也可以使用相同的方法。

坏处:这种方法需要调用2次超类型的构造函数,同名的属性方法会被覆盖一次。

3.原型式继承 (类似Object.create())

function object (o) {  function F () {}  F.prototype=o;  return new F();}
var obj={}; //将obj对象传入作为新对象的原型。
var me=object(obj);

使用这种方法继承需要有一个对象作为原型对象,所以所有继承其的子类型的属性方法都是共用的。

ES5通过新增Object.creatr()方法规范了原型式继承。

4.寄生式继承 (可以设置私有方法的原型式继承)

function object (o) {  function F () {}  F.prototype=o;  return new F();}var obj={};      //将obj对象传入作为新对象的原型。到这里都与原型式继承相同
function creObj(o) {
  var clone=object(obj);
  clone.sayHi=function () {
    alert("Hi");
  };
return clone;
}var me=creObj(obj);

好处:这种方式弥补了原型式继承只有公有属性方法的缺陷,使子类型能有私有属性方法。

5.寄生组合式继承

function inherit (father,son) {  var pro=Object(father.prototype);  //创建超类型原型对象的副本  pro.constructor=son;  son.prototype=pro;           //将副本作为子类型的原型对象}

本方法用于弥补组合继承中属性方法覆盖的问题。

用上图代码代替组合继承中 Son.prototype=new Father(); 这段代码。这样只需调用一次父类型的构造函数,避免了创造多余不必要的属性方法,并且保持了原型链不改变,是一种理想的引用类型继承方法。