现代继承模式可表述为:其他任何不需要以类的方式考虑得模式。

  现代继承方式#1 —— 原型继承之无类继承模式

  1. function object(o) {
  2. function F() {};
  3. F.prototype = o;
  4. return new F();
  5. }
  6.  
  7. function Person() {
  8. this.name = 'king';
  9. }
  10. Person.prototype.getName = function () {
  11. return this.name;
  12. };
  13.  
  14. var papa = new Person();
  15. var kid = object(papa);
  16. console.log(kid.getName()); //king

  现代继承方式#2 —— 通过复制属性实现继承

  1. /**
  2. * 1>包括深度复制和浅复制
  3. * 2>引深而来,引入“mix-in”(混入)模式,它并不是复制一个完整的对象,而是从多个对象中复制出任意的成员
  4. * 并将这些成员组合成一个新的对象。
  5. */
  6. //浅复制
  7. function extend(parent, child) {
  8. var i;
  9. child = child || {};
  10. for (i in parent) {
  11. if (parent.hasOwnProperty(i)) {
  12. child[i] = parent[i];
  13. }
  14. }
  15. return child;
  16. }
  17.  
  18. //深度复制
  19. function extendDeep(parent, child) {
  20. var i,
  21. toStr = Object.prototype.toString,
  22. astr = '[object Array]';
  23.  
  24. child = child || {};
  25.  
  26. for (i in parent) {
  27. if (parent.hasOwnProperty(i)) {
  28. if (typeof parent[i] === 'object') {
  29. child[i] = (toStr.call(parent[i]) === astr) ? [] : {};
  30. extendDeep(parent[i], child[i]);
  31. } else {
  32. child[i] = parent[i];
  33. }
  34. }
  35. }
  36.  
  37. return child;
  38. }
  39. //测试深度复制
  40. var dad = {
  41. counts: [1, 2, 3],
  42. reads: {paper: true}
  43. };
  44. var kid = extendDeep(dad);
  45. kid.counts.push(4);
  46. console.log(kid.counts.toString()); //1,2,3,4
  47. console.log(dad.counts.toString()); //1,2,3

  现代继承方式#3 —— 借用方法

  1. /**
  2. * 有时候,可能恰好仅仅需要现有对象其中的一个或两个方法。在想要重用这些方法的同时,但是又确实不希望与源对象形成父-子关系。
  3. * 也就是说,指向使用所需要的方法,而不希望继承所有哪些永远都不会用到的其他方法。
  4. * 这个时候,可以通过借用方法模式来实现,而这是收益与call()和apply()函数方法。
  5. * 同时,可以绑定函数的作用域。
  6. */
  7. function f() {
  8. var args = [].slice.call(arguments, 1, 3);
  9. //同样可使用
  10. Array.prototype.slice.call(arguments, 1, 3); //免于创建新数组了
  11. return args;
  12. }
  13. f(1, 2, 3, 4, 5, 6); //2,3

  在上一篇文章中,介绍了函数复用模式之类式继承模式。两者全然阐述代码复用的模式,并形成鲜明对比。建议总是争取采用一种现代的继承模式,除非团队在不涉及到类的时候对此真的感到不适应。

  需要记住——代码重用才是最终目的,而继承知识实现这一目标的方法之一。

  源自:《JavaScript模式》

【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式的更多相关文章

  1. 《JavaScript 模式》读书笔记(6)— 代码复用模式2

    上一篇讲了最简单的代码复用模式,也是最基础的,我们普遍知道的继承模式,但是这种继承模式却有不少缺点,我们下面再看看其它可以实现继承的模式. 四.类式继承模式#2——借用构造函数 本模式解决了从子构造函 ...

  2. 《JavaScript 模式》读书笔记(6)— 代码复用模式3

    我们之前聊了聊基本的继承的概念,也聊了很多在JavaScript中模拟类的方法.这篇文章,我们主要来学习一下现代继承的一些方法. 九.原型继承 下面我们开始讨论一种称之为原型继承(prototype ...

  3. 《JavaScript 模式》读书笔记(4)— 函数5

    这一篇是函数部分的最后一篇.我们来聊聊Curry化. 十.Curry 这部分我们主要讨论Curry化和部分函数应用的内容.但是在深入讨论之前,我们需要先了解一下函数应用的含义. 函数应用 在一些纯粹的 ...

  4. JavaScript模式读书笔记 第4章 函数

    2014年11月10日 1.JavaScript函数具有两个特点: 函数是第一类对象    函数能够提供作用域         函数即对象,表现为:         -1,函数能够在执行时动态创建,也 ...

  5. 《JavaScript 模式》读书笔记(4)— 函数4

    这篇文章我们主要来学习下即时对象初始化.初始化时分支.函数属性-备忘模式以及配置对象.这篇的内容会有点多. 六.即时对象初始化 保护全局作用域不受污染的另一种方法,即时对象初始化模式.这种模式使用带有 ...

  6. 读书笔记之 - javascript 设计模式 - 门面模式

    门面模式有俩个作用: 简化类的接口 消除类与使用它的客户代码之间的耦合 在javascript中,门面模式常常是开发人员最亲密的朋友.它是几乎所有javascript库的核心原则,门面模式可以使库提供 ...

  7. 读书笔记之 - javascript 设计模式 - 组合模式

    组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...

  8. 读书笔记之 - javascript 设计模式 - 装饰者模式

    本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象. ...

  9. PHP读书笔记(7)- 函数

    自定义函数 PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻 ...

  10. 【 js 基础 】【读书笔记】Javascript “继承”

    是时候写一写 “继承”了,为什么加引号,因为当你阅读完这篇文章,你会知道,说是 继承 其实是不准确的. 一.类1.传统的面向类的语言中的类:类/继承 描述了一种代码的组织结构形式.举个例子:“汽车”可 ...

随机推荐

  1. 初次使用erlang的concurrent

    如果不是它骇人听闻的并行性能,几乎不会考虑去学习这么一门语言.因为它的并行,我看到的是一块用软件写出来的电路板,是的,它几乎就是把电脑变成了一个可以自由编写逻辑的芯片. 例程来自这里:http://w ...

  2. 在cmd下编译一个简单的servlet时出现程序包javax.servlet不存在

    由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决“软件包 javax.servlet不存 ...

  3. eclipse中新建javaweb项目,查看某些类的源码

    网上查到的大多说在项目下选择properties,在java Build Path下Add ExternalJAR Selection,加上Tomcat->lib下的servlet-api.ja ...

  4. subplot的应用

    import matplotlib.pyplot as Plot Plot.subplot(3, 4, (1, 7)) Plot.subplot(1, 4, 4) Plot.subplot(3, 4, ...

  5. [名词解释]Constant Amortized Time

    http://stackoverflow.com/questions/200384/constant-amortized-time 分摊常量时间: Amortised time explained i ...

  6. windows2008R2安全加固

    一.更改终端默认端口号 步骤: 1.运行regedit 2.[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\W ...

  7. IOS: 使用imageIO获取和修改图片的exif信息

    使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...

  8. editplus快捷键大全其他editplus快捷键

    editplus快捷键大全其他editplus快捷键,更多快捷键请参考以下文章:editplus快捷键大全之editplus搜索快捷键 editplus快捷键大全之editplus编辑快捷键 edit ...

  9. PHP+MySQL无限级分类(非递归)

    要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...

  10. IIS计数器

    Bytes Total/sec 是 Bytes Sent/sec 与 Bytes Received/sec 的总和.这是 Web 服务每秒传输的总字节数. Cache Total Turnover R ...