实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象。

  1.类式继承模式#1 —— 默认方式(原型指向父函数实例)

function Parent(name) {
this.name = name || 'king';
}
Parent.prototype.say = function () {
return this.name;
}; function Child(name) {
this.name = name;
} function inherit(C, P) {
/**
* 1>该继承模式同时继承了两个对象的属性,即添加到this的属性以及原型属性。
* 在绝大多数的时候,并不需要这些自身的属性,因为它们很可能是指向一个特定的实例,而不是复用。
* 但是我们可以提供覆盖属性的方式进行实例化更新。
* 2>对于构造函数的一般经验法则是:应该将可服用的成员添加到原型中。
*/
C.prototype = new P();
}
inherit(Child, Parent); var child = new Child('kingChild');
console.log(child.say()); //king

  2.类式继承模式#2 —— 借用构造函数

function Parent(name) {
this.name = name || 'king';
}
Parent.prototype.say = function () {
return this.name;
}; function Child(name) {
/**
* 1>优点:可以获得父对象自身成员的真实副本,不会存在子对象意外覆盖父对象属性的风险。
* 2>缺点:无法从原型中继承任何东西 ,它并不会为每个实例重新创建原型。
*/
Parent.apply(this, arguments);
} var child = new Child('kingChild');
console.log(child.say()); //Object #<Child> has no method 'say'

  3.类式继承模式#3 —— 借用和设置原型(调用了两次父构造)

function Parent(name) {
this.name = name || 'king';
}
Parent.prototype.say = function () {
return this.name;
}; function Child(name) {
//1>先借用构造函数
Parent.apply(this, arguments);
}
//2>设置子构造函数的原型使其指向父构造函数创建的新实例
Child.prototype = new Parent(); var child = new Child('kingChild');
console.log(child.say()); //kingChild

  4.类式继承模式#4 —— 共享原型

function Parent(name) {
this.name = name || 'king';
}
Parent.prototype.say = function () {
return this.name;
}; function Child(name) {
this.name = name;
}
/**
* 所以的对象实例实际上都共享了同一个原型。但是,这同时也是一个缺点,
* 因为如果在继承链下方的某处存在一个子对象或者孙子对象修改了原型,它将会影响到所有的父对象和祖先对象。
*/
function inherit(C, P) {
C.prototype = P.prototype;
}
inherit(Child, Parent); var child = new Child('kingChild');
console.log(child.say()); //kingChild

  5.类式继承模式#5 —— 临时构造函数

function Parent(name) {
this.name = name || 'king';
}
Parent.prototype.say = function () {
return this.name;
}; function Child(name) {}
/**
* 这里的子对象仅仅继承了父对象的原型中的属性,这种方式是可取的,因为原型正是放置可复用功能的位置。
* 在这种模式中,父构造函数添加到this中的任何成员都不会被继承。
*/
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
inherit(Child, Parent); var child = new Child('kingChild');
console.log(child.name); //undefined
console.log(child.say); //function () {...}

  

  类式继承模式 —— 总结

var inherit = (function () {
/**
* 应用闭包使得在每次需要继承时都创建临时(代理)构造函数。
*/
var F = function () {};
return function (C, P) {
F.prototype = P.prototype;
C.prototype = new F();
/**
* uber属性是指向超类的指针(不使用super仅仅是因为它是关键字),
* 这就像在其他编程语言中访问超类一样,这可以偶尔排上用场。
*/
C.uber = P.prototype;
/**
* 充值构造函数指针
* 如果不充值该构造函数指针,那么所有子对象将会报告Parent()是它们的构造函数,这是没有任何用处的。
* 重置constructor属性使其指向期望的构造函数且不会影响其功能,这是由于该属性主要是用于提供对象的信息。
*/
C.prototype.constructor = C;
}
})();

  源自《JavaScript模式》

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

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

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

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

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

  3. 精读JavaScript模式(八),JS类式继承

    一.前言 这篇开始主要介绍代码复用模式(原书中的第六章),任何一位有理想的开发者都不愿意将同样的逻辑代码重写多次,复用也是提升自己开发能力中重要的一环,所以本篇也将从“继承”开始,聊聊开发中的各种代码 ...

  4. javascript类式继承模式#4——共享原型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. javascript类式继承模式#3——借用和设置原型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. javascript类式继承模式#2——借用构造函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. javascript类式继承模式#1——默认模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. js类式继承模式学习心得

    最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...

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

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

随机推荐

  1. OKR详解及其实施

    这阵子大家一直在讨论Google的绩效考核方法OKR,我们发现很多文章和说法存在错误和误导,现将其来龙去脉,操作步骤,操作技巧阐述如下,供大家参考. OKR全称是Objectives and Key ...

  2. hdu acmsteps 2.2.1 Fibonacci

    Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. The AndroidManifest.xml File

    manifest (船运的)载货清单 http://www.android-doc.com/guide/topics/manifest/manifest-intro.html Every applic ...

  4. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  5. Mongo报如下类似错误时的修改方法Cannot natively represent the long 1396367483000 on this platform

    今天通过php连接mongodb,并读取数据时,其中一个字段为: "createTime":NumberLong("1397524645000"),由于太长,一 ...

  6. Java,PostgreSQL时间范围查询

    遇到一坑:对于如下代码 select * from order_mileagefuel where date > '2015-11-1' and date< '2015-11-5' 在Po ...

  7. UrlConnection连接和Socket连接的区别

    关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下: 抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节. urlconnection 基于H ...

  8. sprintf()函数的用法

    sprintf(g_strAppName, "%s",pLast+1); ----------------------------------------------------- ...

  9. 微信成为首批支持iPhone 6s /Plus 上 3D Touch 功能的 App

    2015苹果新品发布会上微信成为首批支持iPhone 6s 和 iPhone 6s Plus 上 3D Touch 功能的 App.通过 3D Touch,微信用户将可以通过更精减的操作完成基本任务, ...

  10. 微信智慧KTV上线 不怕周末订不到包厢了

    周末邀三五好友唱唱歌是件惬意的事,可订包厢是个烦心事,总是people mountain people sea,而且价格比平时高出不少.现在好了,微信智慧KTV上线了,将有效解决传统KTV收银时间集中 ...