细谈Javascript继承随记

   说到javascript继承,从后台转到前端开发的jser,一般的开发习惯是那种后台面向对象式开发

像这种后台的面向对象编程,在前端JS开发中,也有类似的概念,就是JS继承方法中的类式继承。

   首先我们定义一个父类,

   

  var Person=function(name){

      this._name=name;

  }



  Person.prototype.getName=function(){

      return this._name;

  } 

  像在后台面向对象中的继承一样,我们再定义一个子类来继承上面的父类

 

var Author=function(name,books){

    Person.call(this,name);

    this._books=books;

}



Author.prototype=new Person();

Author.prototype.constructor=Author;

Author.prototype.getBooks=function(){

    return this._books;

}

  上面的继承是利用javascript原型来继承父类的方法,属性是调用父类的构造,传入子类的实例对象来实现的,由于原型赋了父类对象的值,所以此时子类的原型

构造对象就变成了父类,所以此时需要重新设置子类原型的constructor,这样方便instance of 调用的时候,返回的是子类的对象。

其实上面子类继承父类的时候,做了些额外的操作,这些操作可以定义一个通用的方法来实现,见下面的代码。

var extend=function(subclas,superclass){

  

    var F=function(){};

    F.prototype=superclass.prototype;

   subclass.prototype=new F;

   subclass.prototype.constructor=subclass;// 此处修改构造为自己



   subclass._superclass=superclass.prototype;



   if (superclass.prototype.constructor===Object.prototype.constructor){

        superclass.prototype.constructor=superclass;

  }



}

  通过上面通用extend方法,可以修改一下子类对父类继承的实现,见下面的代码。

 var Author=function(name,books){



     //此处调用自己的父类属性来调用,减少偶合

    Author._supeclass.constructor.call(this,name);

    this._books=books;

}



 extend(Author,Person);



Author.prototype.getBooks=function(){

   

   //此处可以通用父类属性来调用父类的方法

   var name=Author._superclass.getName.call(this);

   console.log(name+this.books);

}

  现在我们来写了调用的例子来看我们的成果。

var au=new Author('xu','book1,book2');



au.getBooks();

//打印出 xu book1,book2

  以上只是自己在学习js面向对象中类式继承中的一些体会,尽供参考。

你可能感兴趣的:(JavaScript)