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>