js继承的13种方式

也可以说只有12种,ES6的extend 也是12种方法之一-寄生继承的语法糖

1、原型链法

代码示例

Child.prototype = new Parent();

所属模式:

1、基于构造器工作方式

2、使用原型链模式

技术注解

1、默认继承机制

2、提示:我们可以将方法与属性集中可重用的部分迁移到原型链中,而将不可重用的那部分设置为对象的自身属性

详细代码解释

2、仅从原型链继承法

代码示例

Child.prototypo = Parent.prototype

所属模式

1、基于构造器工作模式

2、原型拷贝模式(不存在原型链,所有对象共享一个原型)

技术注解

1、由于该模式在构建继承关系时不需要新建实例,效率上有较好的表现

2、原型链上的查询也会比较快,因为这里根本不存在链

3、缺点在于,对子对象的修改会直接影响其父对象

详细代码注解

3、临时构造器法

代码示例

function extend(Child, Parent){
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype
}

所属模式

1、基于构造器工作的模式

2、使用原型链模式

技术注解

1、此模式不同于1号方法,它只继承父对象的原型属性,而对其自身属性(也就是被构造器添加到this值中的属性)则不予继承;

2、另外,该模式还为我们访问父对象提供了便利的方法(通过uber 属性)

详细代码注解

4、原型属性拷贝法

代码示例

function extend2(Child, Parent){
var p = Parent.prototype;
var c = Child.prototype;
for(var i in p) {
c[i] = p[i]
}
c.uber = p
}

所属模式

1、基于构造器工作的模式

2、使用原型链模式

3、拷贝属性模式

技术注解

1、将父对象原型中的内容全部转换成子对象原型属性

2、无须为继承单独创建对象实例

3、原型链本身也更短

详细代码注解

5、全属性拷贝法(浅拷贝法)

代码示例

function extend2(p){
var c = {};
for(var i in p) {
c[i] = p[i]
}
c.uber = p
return c
}

所属模式

1、基于对象工作模式

3、拷贝属性模式

技术注解

1、非常简单

2、没有使用原型属性

详细代码注解

6、深拷贝法

代码示例

let deepCopy = function (child, parent){
var child = child || {};
for(var i in parent) {
if(typeof parent[i] === "object") { // 引用类型的判断
child[i] = Array.isArray(parent[i]) ? [] : {}; // child[i] 跟这个parent[i] 走
deepCopy(child[i], parent[i]);
} else {
child[i] = parent[i]
}
}
return child;
}

所属模式

1、基于对象工作模式

3、拷贝属性模式

技术注解

1、非常简单

2、没有使用原型属性

3、所有对象执行的都是值传递

详细代码注解

7、原型继承法

代码示例

function object(o){
function F() {}
F.prototype = o;
return new F();
}

所属模式

1、基于对象工作模式

2、使用原型链模式

技术注解

1、丢开仿类机制,直接在对象之间构造继承关系

2、发挥原型固有优势

详细代码注解

8、扩展与增强模式

代码示例

function objectPlus(o, stuff){
var n ;
function F(){};
F.prototype = o;
n = new F();
n.uber = o;
for(var i in stuff) {
n[i] = stuff[i];
}
return n;
}

所属模式

1、基于对象工作模式

2、使用原型链模式

3、属性拷贝模式

技术注解

1、原型继承法和属性拷贝法的混合应用

2、它通过一个函数一次性完成对象的继承和扩展

详细代码注解

9、多重继承法

代码示例

function multi(){
var n = {}, stuff, j, len = arguements.length;
for(j = 0; j < len; j++) {
stuff = arguments[j];
for(var i in stuff) {
n[i] = stuff[i]
}
}
return n
}

所属模式

1、基于对象工作模式

2、属性拷贝模式

技术注解

1、混合插入式继承实现

2、它会按照父对象的出现顺序一次对它们执行属性全拷贝

详细代码注解

10、寄生继承法

代码示例

function parasite(){
var that = Object.create(victim);
that.more = 1;
return that;
}

所属模式

1、基于对象工作模式

2、使用原型链模式

技术注解

1、该方法通过一个类似构造器的函数来创建对象

2、该函数会执行相应的对象拷贝,并对其进行扩展,然后返回该拷贝

详细代码注解

11、构造器借用法

代码示例

function Child(){
Parent.apply(this, arguements)
}

所属模式

1、基于构造器工作模式

技术注解

1、该方法可以只继承父对象的自身属性

2、可以与方法1结合使用,以便从原型中继承相关内容

3、它便于我们的子对象继承某个对象具体属性(并且还有可能是引用类型属性)时,选择最简单的处理方式

详细代码注解

12、构造器借用与属性拷贝

代码示例

function Child(){
Parent.apply(this, arguements)
}
extend2(Child, Parent)

所属模式

1、使用构造器工作模式

2、使用原型链模式

3、属性拷贝模式

技术注解

1、该方法是构造器借用与属性拷贝法结合体

2、允许我们在不重复调用父对象构造函数的情况下同时继承其自身属性和原型属性

详细代码注解

13、ES6 extend

代码示例

let Parent = function () {};

class Child extend Parent {
constructor(){
super(this)
}
}

所属模式

1、基于对象工作模式

2、使用原型链模式

技术注解

1、该方法是寄生继承法的语法糖

2、可以用babel 将其转化一下,就能看到它实际的工作模式(寄生继承, Object.create(obj))

详细代码注解

参考

《javascript面向对象编程指南》

js的13种继承的更多相关文章

  1. js的6种继承方式

    重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...

  2. 细说 js 的7种继承方式

    在这之前,先搞清楚下面这个问题: function Father(){} Father.prototype.name = 'father'; Father.prototype.children = [ ...

  3. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  4. 重新理解JS的6种继承方式

    写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...

  5. js的5种继承方式——前端面试

    js主要有以下几种继承方式:对象冒充,call()方法,apply()方法,原型链继承以及混合方式.下面就每种方法就代码讲解具体的继承是怎么实现的. 1.继承第一种方式:对象冒充 function P ...

  6. js的2种继承方式详解

    js中继承可以分为两种:对象冒充和原型链方式 一.对象冒充包括三种:临时属性方式.call()及apply()方式1.临时属性方式 复制代码代码如下: function Person(name){   ...

  7. Spirit带你彻底搞懂JS的6种继承方案

    JavaScript中实现继承的6种方案 01-原型链的继承方案 function Person(){ this.name="czx"; } function Student(){ ...

  8. js中几种继承实现

    继承实现的几种方式 1.借助call实现继承 function p1() { this.name = 'p1' this.say = function () { console.log(this.na ...

  9. js的几种继承方式

    1.原型链方式 function Super(){ this.val = 1; this.arr = [1]; } function Sub(){ // ... } Sub.prototype = n ...

随机推荐

  1. Python 学习笔记(3)

    Python 文件I/O 读取键盘输入: Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘: 1. raw_input #函数从标准输入读取一个行,并返回一个字符串(去掉结尾 ...

  2. window下象MAC一样工作的工具

    前面是MAC 后面是windows对应工具,只是做一个列表说明,具体使用自行百度 1.item2 vs Cmder 命令行 2.Homebrew vs Chocolatey 包管理器 3.Spotli ...

  3. nacos服务注册与发现之客户端

    服务注册 1.1 NamingService.registerInstance的方法为客户端提供的服务注册接口 1.2 客户端通过调用NamingService.registerService上报到n ...

  4. 学习java之基础语法(一)

    学习java之基础语法(一) 基本语法 编写 Java 程序时,应注意以下几点: 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的. 类名:对于所有的类来说 ...

  5. Blackduck的Hub安装教程

    1 产品介绍 Black Duck 是最早进行开源代码检测工具开发的公司,其产品包括Protex 和HUB,Protex 强调检测的精度和准确性,而HUB 强调检测的速度和易用性. 1.1 Prote ...

  6. 【转载】快速理解android View的测量onMeasure()与MeasureSpec

    笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问 ...

  7. POJ-2236(并查集)

    Wireless NetWork POJ-2236 需要注意这里的树的深度需要初始化为0. 而且,find函数需要使用路径压缩,这里的unint合并函数也使用了优化(用一开始简单的合并过不了). #i ...

  8. 图解如何在Linux上配置git自动登录验证

    记录一下配置git操作远程仓库时的自动验证,效果如下图: 本文介绍的是Linux下的配置.Windows上默认已经启用凭证存储和自动验证(依靠wincred实现,以后会使用GCM-Core). 准备工 ...

  9. mongodb 聚合(aggregate)

      MongoDB中文手册|官方文档中文版 https://docs.mongoing.com/ 聚合操作处理数据记录和 return 计算结果.聚合操作将来自多个文档的值组合在一起,并且可以对分组数 ...

  10. 开灯问题3_2(JAVA语言)

    package 第三章; public class 开灯问题3_2 { public static void main(String[] args) { // TODO Auto-generated ...