细谈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面向对象中类式继承中的一些体会,尽供参考。

原文地址:https://www.cnblogs.com/xuwenmin888/p/2987778.html