js的13种继承
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种继承的更多相关文章
- js的6种继承方式
		
重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...
 - 细说 js 的7种继承方式
		
在这之前,先搞清楚下面这个问题: function Father(){} Father.prototype.name = 'father'; Father.prototype.children = [ ...
 - js的三种继承方式及其优缺点
		
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
 - 重新理解JS的6种继承方式
		
写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...
 - js的5种继承方式——前端面试
		
js主要有以下几种继承方式:对象冒充,call()方法,apply()方法,原型链继承以及混合方式.下面就每种方法就代码讲解具体的继承是怎么实现的. 1.继承第一种方式:对象冒充 function P ...
 - js的2种继承方式详解
		
js中继承可以分为两种:对象冒充和原型链方式 一.对象冒充包括三种:临时属性方式.call()及apply()方式1.临时属性方式 复制代码代码如下: function Person(name){ ...
 - Spirit带你彻底搞懂JS的6种继承方案
		
JavaScript中实现继承的6种方案 01-原型链的继承方案 function Person(){ this.name="czx"; } function Student(){ ...
 - js中几种继承实现
		
继承实现的几种方式 1.借助call实现继承 function p1() { this.name = 'p1' this.say = function () { console.log(this.na ...
 - js的几种继承方式
		
1.原型链方式 function Super(){ this.val = 1; this.arr = [1]; } function Sub(){ // ... } Sub.prototype = n ...
 
随机推荐
- 【Azure 应用服务】App Service与APIM同时集成到同一个虚拟网络后,如何通过内网访问内部VNET的APIM呢?
			
问题描述 App Service访问的APIM已配置内部虚拟网络(Internal VNet)并拥有内网IP地址.App Service与APIM都在相同的虚拟网络(VNET)中.App Servic ...
 - 基于SaaS平台的iHRM项目的前端项目介绍
			
1.下载安装node.js 访问https://nodejs.org/en/,然后下载安装即可 2. 查看是否安装成功 打开cmd命令行,输入node -v 如果出现对应的版本号,即为安装成功 3.从 ...
 - es6 快速入门 系列
			
es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...
 - (三)String、StringBuilder、StringBuffer在字符串操作中的性能差异浅析
			
参考资料:https://www.iteye.com/blog/hank4ever-581463 <Core Java Volume I-Fundamentals>原书第十版 <Ja ...
 - 靶场练习-Sqli-labs通关记录(1-4关)
			
0x00 实验环境 本地:Win 10 靶场:sqli-labs(共65关,每日一关) 0x02 通关记录 简介:一天一关! (1)第一关: 简单的 ...
 - 漏洞复现-Discuz-命令执行(wooyun-2010-080723)
			
0x00 实验环境 攻击机:win10 靶机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Discuz 7.x 6.x版本 0x02 实验目的 学习d ...
 - ElasticSearch 进阶
			
目录 ElasticSearch 进阶 SearchAPI 检索信息 Query DSL 基本语法格式 查询-match 查询-match_phrase 查询-multi_match 查询-bool复 ...
 - 多租缓存实现方案 (Java)
			
多租缓存实现方案 (Java) 缓存在系统中是不可少的,缓存的实现是一个从无到有的过程,最开始,单应用的,缓存都是应用内部的,Map基本就能满足,实现简单.但是当上了微服务之后,应用是多部署的,应用之 ...
 - P3796 【模板】AC自动机(加强版) 题解(Aho-Corasick Automation)
			
题目链接 AC自动机 解题思路 AC自动机模板题. 刚学AC自动机,写一篇博客增强理解. AC自动机最关键的一点在于,\(fail\)失配指针的构造. \(fail\)指针指向的地方,是匹配出现错误后 ...
 - mybatis&plus系列------Mysql的JSON字段的读取和转换
			
mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...