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. eclipse快速定位当前类所在位置

    如何快速的找到一个类并且定位它所在的位置呢?这里以搜索Menu类为例说明. 可以通过CTRL + SHIFT +R的组合键,输入Menu 双击Menu.java即可跳转到对应的类上,但此时还不知道此类 ...

  2. Django-用户权限,用户角色使用指南

    RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户 ...

  3. 关于Java中for,while,if,方法的练习

    练习 计算0到100之间的奇数和偶数和 package com.kangkang.forDemo;​public class demo01 {    public static void main(S ...

  4. 后端程序员之路 38、Scala入门

    Scala 是 Scalable Language 的简写,是一门多范式的编程语言. 语言特性:1.面向对象,所有值都是对象,类可以继承和组合:2.函数式,支持闭包,支持柯里化等等:3.静态类型,支持 ...

  5. Python切换版本工具pyenv

    目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...

  6. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  7. docker 部署mysql服务之后,执行sql脚本

    1,先将.sql文件copy到docker容器里 docker ps //找到容器的短ID或者指定的name. docker inspect  -f '{{.Id}}' id or name 得到指定 ...

  8. 选择 FreeBSD 而不是 Linux 的技术性原因2

    ZFSZFS 文件系统是 FreeBSD 上的一等公民.这不仅意味着可以在 ZFS 上安装根目录,安装程序也支持这一点,而且还意味着很多基础系统工具都已经紧密地集成或构建了对 ZFS 的支持.在 Fr ...

  9. sprintgboot+springsecurity的跨域问题,

    整个项目是使用前后端分离的形式开发,登录接口部分出现了问题, 重写了security的登录接口,返回json数据 到这一步已经没有没有问题了,使用postman测试,也可以看到接口返回的结果,但是使用 ...

  10. C指针与二维数组

    先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...