js深入研究之无法理解的js类代码,extend扩展

<script type="text/javascript">
function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
}

function Author(name, books) {
  Person.call(this, name); // 定义:调用一个对象的一个方法,以另一个对象替换当前对象。
  this.books = books; // Add an attribute to Author.
}

Author.prototype = new Person(); // 设置原型链
Author.prototype.constructor = Author; // 设置构造属性
Author.prototype.getBooks = function() { // 添加方法
  return this.books;
};

var author = [];
author[0] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[1] = new Author('Ross Harmes', ['JavaScript Design Patterns']);

alert(author[0].getName()); //输出 Dustin Diaz
alert(author[0].getBooks()); //输出 JavaScript Design Patterns
alert(author[1].getName()); //输出 Ross Harmes
alert(author[1].getBooks()); //输出 JavaScript Design Patterns
</script>

功力不够,无法理解

进一步升级提取

<script type="text/javascript">
/* 扩展函数 */
function extend(subClass, superClass) {
  var F = function() {};
  F.prototype = superClass.prototype; // F已成superClass父类
  subClass.prototype = new F(); //子类继承父类的原子
  subClass.prototype.constructor = subClass;
}


/* Person类 */

function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
}

/* Author类 */

function Author(name, books) {
  Person.call(this, name);
  this.books = books;
}
extend(Author, Person);

Author.prototype.getBooks = function() {
  return this.books;
};


var author = []; //定义数组
author[0] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[1] = new Author('Ross Harmes', ['JavaScript Design Patterns']);

alert(author[0].getName()); //输出 Dustin Diaz
alert(author[0].getBooks()); //输出 JavaScript Design Patterns
alert(author[1].getName()); //输出 Ross Harmes
alert(author[1].getBooks()); //输出 JavaScript Design Patterns
</script>

 进一步改进,太牛逼了,作者

<script type="text/javascript">
/* 扩展函数 */
function extend(subClass, 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;
  }
}


/* Person类 */

function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
}

/* Author类 */

function Author(name, books) {
  Author.superclass.constructor.call(this, name);
  this.books = books;
}
extend(Author, Person);

Author.prototype.getBooks = function() {
  return this.books;
};

Author.prototype.getName = function() {
  var name = Author.superclass.getName.call(this);
  return name + ', Author of ' + this.getBooks().join(', ');
};

var author = []; //定义数组
author[0] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[1] = new Author('Ross Harmes', ['JavaScript Design Patterns']);

alert(author[0].getName()); //输出 Dustin Diaz , Author of JavaScript Design Patterns
alert(author[0].getBooks()); //输出 JavaScript Design Patterns
alert(author[1].getName()); //输出 Ross Harmes , Author of JavaScript Design Patterns
alert(author[1].getBooks()); //输出 JavaScript Design Patterns
</script>
原文地址:https://www.cnblogs.com/jiqing9006/p/5051835.html