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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值