1. <script type="text/javascript">
  2. function Person(name) {
  3. this.name = name;
  4. }
  5.  
  6. Person.prototype.getName = function() {
  7. return this.name;
  8. }
  9.  
  10. function Author(name, books) {
  11. Person.call(this, name); // 定义:调用一个对象的一个方法,以另一个对象替换当前对象。
  12. this.books = books; // Add an attribute to Author.
  13. }
  14.  
  15. Author.prototype = new Person(); // 设置原型链
  16. Author.prototype.constructor = Author; // 设置构造属性
  17. Author.prototype.getBooks = function() { // 添加方法
  18. return this.books;
  19. };
  20.  
  21. var author = [];
  22. author[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
  23. author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']);
  24.  
  25. alert(author[].getName()); //输出 Dustin Diaz
  26. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  27. alert(author[].getName()); //输出 Ross Harmes
  28. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  29. </script>

功力不够,无法理解

进一步升级提取

  1. <script type="text/javascript">
  2. /* 扩展函数 */
  3. function extend(subClass, superClass) {
  4. var F = function() {};
  5. F.prototype = superClass.prototype; // F已成superClass父类
  6. subClass.prototype = new F(); //子类继承父类的原子
  7. subClass.prototype.constructor = subClass;
  8. }
  9.  
  10. /* Person类 */
  11.  
  12. function Person(name) {
  13. this.name = name;
  14. }
  15.  
  16. Person.prototype.getName = function() {
  17. return this.name;
  18. }
  19.  
  20. /* Author类 */
  21.  
  22. function Author(name, books) {
  23. Person.call(this, name);
  24. this.books = books;
  25. }
  26. extend(Author, Person);
  27.  
  28. Author.prototype.getBooks = function() {
  29. return this.books;
  30. };
  31.  
  32. var author = []; //定义数组
  33. author[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
  34. author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']);
  35.  
  36. alert(author[].getName()); //输出 Dustin Diaz
  37. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  38. alert(author[].getName()); //输出 Ross Harmes
  39. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  40. </script>

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

  1. <script type="text/javascript">
  2. /* 扩展函数 */
  3. function extend(subClass, superClass) {
  4. var F = function() {};
  5. F.prototype = superClass.prototype;
  6. subClass.prototype = new F();
  7. subClass.prototype.constructor = subClass;
  8.  
  9. subClass.superclass = superClass.prototype;
  10. if(superClass.prototype.constructor == Object.prototype.constructor) {
  11. superClass.prototype.constructor = superClass;
  12. }
  13. }
  14.  
  15. /* Person类 */
  16.  
  17. function Person(name) {
  18. this.name = name;
  19. }
  20.  
  21. Person.prototype.getName = function() {
  22. return this.name;
  23. }
  24.  
  25. /* Author类 */
  26.  
  27. function Author(name, books) {
  28. Author.superclass.constructor.call(this, name);
  29. this.books = books;
  30. }
  31. extend(Author, Person);
  32.  
  33. Author.prototype.getBooks = function() {
  34. return this.books;
  35. };
  36.  
  37. Author.prototype.getName = function() {
  38. var name = Author.superclass.getName.call(this);
  39. return name + ', Author of ' + this.getBooks().join(', ');
  40. };
  41.  
  42. var author = []; //定义数组
  43. author[] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
  44. author[] = new Author('Ross Harmes', ['JavaScript Design Patterns']);
  45.  
  46. alert(author[].getName()); //输出 Dustin Diaz , Author of JavaScript Design Patterns
  47. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  48. alert(author[].getName()); //输出 Ross Harmes , Author of JavaScript Design Patterns
  49. alert(author[].getBooks()); //输出 JavaScript Design Patterns
  50. </script>

js深入研究之无法理解的js类代码,extend扩展的更多相关文章

  1. js深入研究之神奇的匿名函数类生成方式

    <script type="text/javascript"> var Book = (function() { // 私有静态属性 ; // 私有静态方法 funct ...

  2. 深入理解unslider.js源码

    最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. unslider.js 源码和使用教程 ...

  3. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  4. JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后

    Brief 一天有个朋友问我“JS中计算0.7 * 180怎么会等于125.99999999998,坑也太多了吧!”那时我猜测是二进制表示数值时发生round-off error所导致,但并不清楚具体 ...

  5. 关于闭包的理解(JS学习小结)

    前言: 啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油! 因为现在期末啦,下周一也 ...

  6. 封装常用的js(Base.js)——【01】理解库,获取节点,连缀,

    封装常用的js(Base.js)——[01]理解库,获取节点,连缀,  youjobit07 2014-10-10 15:32:59 前言:       现如今有太多优秀的开源javascript库, ...

  7. 关于js with语句的一些理解

    关于js with语句的一些理解   今天看到js的with语句部分,书中写到,with语句接收的对象会添加到作用域链的前端并在代码执行完之后移除.看到这里,我有两点疑问,添加到作用域链前端是不是指对 ...

  8. 【翻译】要理解Ext JS 5小工具

    原版的:Understanding Widgets in Ext JS 5 在Ext JS 5,引入了新的"widgetcolumn",支持在网格的单元格中放置组件. 同一时候,还 ...

  9. 理解Node.js的事件轮询

    前言 总括 : 原文地址:理解Node.js的事件轮询 Node小应用:Node-sample 智者阅读群书,亦阅历人生 正文 Node.js的两个基本概念 Node.js的第一个基本概念就是I/O操 ...

随机推荐

  1. php PDO操作乱码问题

    前阶段用php写了一个小网页(每周一练),然后就一直忙着其他事也没管它,今天想着给它写个添加数据的页面,用pdo操作,没想到插入数据库的中文数据竟然乱码了,竟然乱码了!然后我就方了,赶紧检测数据传输过 ...

  2. win7配置简单的FTP服务器

    1.开启一些win7默认是关闭状态的功能 步骤:控制面板 -> 程序和功能 -> 打开或关闭Windows功能,然后勾选下图中圈起来的部分: 2.添加FTP站点 步骤:桌面的计算机图标 - ...

  3. springMVC学习(1)

    spring mvc的位置: springMVC只是spring的一个模块:   第一步:发起请求到前端控制器(DispatcherServlet) 第二步:DispatcherServlet请求Ha ...

  4. 重写boost内存池

    最近在写游戏服务器网络模块的时候,需要用到内存池.大量玩家通过tcp连接到服务器,通过大量的消息包与服务器进行交互.因此要给每个tcp分配收发两块缓冲区.那么这缓冲区多大呢?通常游戏操作的消息包都很小 ...

  5. mongodb授权登录

    mongodb版本为3.2(目前最新),演示的是linux下的mongodb授权认证 第一次登录不启动授权(mongo默认不启动) ./mongod --dbpath=/home/db/data -- ...

  6. [原创作品] web项目构建(一)

    今天开始,将推出web项目构建教程,与<javascript精髓整理篇>一并更新.敬请关注. 这篇作为这一系列开头,主要讲述web项目的构建技术大全.在众多人看来,web前端开发无非就是写 ...

  7. Windows下Hadoop的环境安装[转]

    1.下载并安装Cygwin,记得cygwin安装中要把SSH选择上,因为后面Hadoop会用到,不详述cygwin的安装过程.我是安装在D:\cygwin下 2.配置系统环境变量 在windows命令 ...

  8. ViewController详解

    一.生命周期 当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc                              创建对象,分配空间2.init (initWit ...

  9. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  10. linux系统自动执行任务(转)

    开机启动 开机启动应该是我们很经常的需求了,我们常需要在开机时就自动执行某些命令来开启服务,进程等,有了它我们不必再在每次开机时输入同一堆命令. chkconfig命令 使用chkconfig命令可以 ...