js深入研究之无法理解的js类代码,extend扩展
2015-12-16 17:41
761 查看
<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>
相关文章推荐
- JavaScript基础学习<四>基本数据和引用类型
- jsp常用的指令与标签
- JSon实体类快速生成插件 GsonFormat 1.2.0
- js深入研究之神奇的匿名函数类生成方式
- <转>js onload/onunload/onbeforeunload事件
- js replaceAll
- JSon解析
- JSTL 核心标签库
- 【学习笔记javascript设计模式与开发实践(代理模式)----6】
- jsp页面中jstl标签详解
- 理解Javascript的call、apply
- JavaScript基础学习<三>参数传递
- OAF调用JavaScript新开窗口
- JS隐藏HTML标签对象
- js中的$.ajax()方法详解
- 滚动到指定位置js
- js 类与constructor属性
- 去除url中讨厌的jssionid
- seajs版本号添加
- lazyload.js详解