<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[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']); alert(author[].getName()); //输出 Dustin Diaz
alert(author[].getBooks()); //输出 JavaScript Design Patterns
alert(author[].getName()); //输出 Ross Harmes
alert(author[].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[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']); alert(author[].getName()); //输出 Dustin Diaz
alert(author[].getBooks()); //输出 JavaScript Design Patterns
alert(author[].getName()); //输出 Ross Harmes
alert(author[].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[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']); alert(author[].getName()); //输出 Dustin Diaz , Author of JavaScript Design Patterns
alert(author[].getBooks()); //输出 JavaScript Design Patterns
alert(author[].getName()); //输出 Ross Harmes , Author of JavaScript Design Patterns
alert(author[].getBooks()); //输出 JavaScript Design Patterns
</script>
js深入研究之无法理解的js类代码,extend扩展的更多相关文章
-
js深入研究之神奇的匿名函数类生成方式
<script type="text/javascript"> var Book = (function() { // 私有静态属性 ; // 私有静态方法 funct ...
-
深入理解unslider.js源码
最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...
-
Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
-
JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
Brief 一天有个朋友问我“JS中计算0.7 * 180怎么会等于125.99999999998,坑也太多了吧!”那时我猜测是二进制表示数值时发生round-off error所导致,但并不清楚具体 ...
-
关于闭包的理解(JS学习小结)
前言: 啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油! 因为现在期末啦,下周一也 ...
-
封装常用的js(Base.js)——【01】理解库,获取节点,连缀,
封装常用的js(Base.js)——[01]理解库,获取节点,连缀, youjobit07 2014-10-10 15:32:59 前言: 现如今有太多优秀的开源javascript库, ...
-
关于js with语句的一些理解
关于js with语句的一些理解 今天看到js的with语句部分,书中写到,with语句接收的对象会添加到作用域链的前端并在代码执行完之后移除.看到这里,我有两点疑问,添加到作用域链前端是不是指对 ...
-
【翻译】要理解Ext JS 5小工具
原版的:Understanding Widgets in Ext JS 5 在Ext JS 5,引入了新的"widgetcolumn",支持在网格的单元格中放置组件. 同一时候,还 ...
-
理解Node.js的事件轮询
前言 总括 : 原文地址:理解Node.js的事件轮询 Node小应用:Node-sample 智者阅读群书,亦阅历人生 正文 Node.js的两个基本概念 Node.js的第一个基本概念就是I/O操 ...
随机推荐
-
mvc4 发布,遇到 403.14 问题,并且iis提示打开目录浏览。。。解决办法
经测试,只需要在web.config的system.web的同级节点,添加如下代码,即可完美运行.原理参考文章:一.<validation validateIntegratedModeConfi ...
-
Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
-
Making raycast ignore multiple layers
I know how to make the raycast ignore a layer but I want it to ignore layers 9 and 10 but collide wi ...
-
转:samba 启动和重新启动 以及在虚拟系统和实际系统怎么实现软件交换
转自:http://blog.csdn.net/zwhfyy/article/details/1605151 启动 smb start 重新启动 root 用户登陆 CHQ_WEB:/etc/init ...
-
查看使用了那种shell
cat /etc/shells root@OpenWrt:/www/cgi-bin# cat /etc/shells/bin/ash
-
删除链表中间节点和a/b处的节点
[题目]: 给定链表的头节点 head,实现删除链表的中间节点的函数. 例如: 步删除任何节点: 1->2,删除节点1: 1->2->3,删除节点2: 1->2->3-& ...
-
centOS7下Spark安装配置
环境说明: 操作系统: centos7 64位 3台 centos7-1 192.168.190.130 master centos7-2 192.168.190.129 slave1 centos7 ...
-
20164319 刘蕴哲 Exp5 MSF基础应用
[实践内容] 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践(这里我做了两个:ms08_067[成功]和ms17_010[成功 ...
-
python 全栈开发,Day1(python介绍,变量,if,while)
python基础一 一,Python介绍 python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为 ...
-
我对git的快速使用和理解
收藏较好的,分享给大家 https://mp.weixin.qq.com/s/k4tU8snvssyKJ2WkvkFrZA