实现类式继承的目标是通过构造函数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. Android APK反编译问题

    因为这几天想做一个离线音乐播放器,然后需要很多.png图片,在度娘上搜图片感觉效果不好, 就需要用到反编译工具来将一些.apk文件中的资源文件提取出来. 这里就只讲下怎么使用工具来进行反编译,什么?你 ...

  2. MVC4笔记 Area区域

    mvc4.0新增的area区域机制,可以协助你在架构较为大型的项目,让独立性较高的部分功能独立成一个MVC子网站,以降低网站与网站之间的耦合性,也可以通过area的切割,让多人同时开发同一个项目时候, ...

  3. C/C+小记

    1.struct与typedef struct struct Student{int a;int b}stu1; //定义名为Student的结构体,及一个Student变量stu1 struct { ...

  4. 高速公路(Highway,ACM/ICPC SEERC 2005,UVa1615)

    I think: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <m ...

  5. nl命令详解

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  6. SpringMVC 和Struts2的区别

    SpringMVC 和Struts2的区别 1. 机制: spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能: spring会稍微比s ...

  7. PHP函数之日期时间函数date()使用详解

    date()函数是我们在php开发中常碰到并且会使用到的一个日期函数,下面我来给大家介绍date()函数的一些基本扮靓和方法,有需要了解的朋友可进入参考   日期时间函数是PHP 的核心组成部分.无需 ...

  8. kindle paperwhite折腾记

    在亚马逊官网上买了一个kindle paperwhite 一代(849元) , 打算再买个皮套, 淘宝店  http://detail.tmall.com/item.htm?spm=a230r.1.1 ...

  9. linux远程连接客户端总结

    序:刚从阿里ECS买了一个ubuntu14.04_64_20G,但是没有提供页面登陆工具,因此从网上找了几个远程连接工具,特写在这里算是总结. 1 secureCRT SecureCRT是一款支持SS ...

  10. thinkphp中I方法

    概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型 ...