实现类式继承的目标是通过构造函数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. ETHREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  2. vim下使用ctags+taglist

    好几年前用过,但是后来就生疏了,好其次都没法鼓起勇气再捡起来...今天不得不用,那既然捡起来了,就好好的记录一下. 简介及安装 ctags是一个应用程序,可以用它来生产当前目录下所有c文件中变量和函数 ...

  3. autofac 初步学习

    //数据处理接口 public interface IDal<T> where T : class { void Insert (T model); void Update(T model ...

  4. c#中的23种设计模式

    C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...

  5. mysql 存储过程中注意的问题

    OPEN cur; REPEAT FETCH cur INTO int_type, int_element_id, int_num, int_user_id; IF NOT _DONE THEN IF ...

  6. CSS小记

    1.元素居中 (1)水平居中:指定宽度,然后margin auto 即可 .middle{ max-width:400px; //width:400px;//当浏览器被缩小,宽度小于元素宽度时,元素会 ...

  7. hdu 1241 Oil Deposits(水一发,自我的DFS)

    解题思路: 1. 遍历扫描二维数组,遇到‘@’,结果ans++; 2. 将当前 i,j 位置置为‘*’,将当前‘@’的 i,j 传人到DFS函数中,开始遍历八个方向的字符 如果碰到 '@' 则先将当前 ...

  8. yum命令一些易遗忘的参数

    这些yum命令是我经常忘记的,所以记录下 yum check-update 检查可更新的RPM包 yum update 更新所有的RPM包 yum update kernel kernel-sourc ...

  9. MAC Java 开发环境配置

    JDK Oracle官网 -> Download -> Java for Developers -> Java SE Downloads -> Java Platform (J ...

  10. AngularJS小试牛刀

    总看别人说argularjs,knockoutjs,mvvm模式这些,光看不练假把式,于是便在自己的一个小网站上做了个简单的页面应用了下argularjs ,详细地址见 http://www.591j ...