一文详解JavaScript的继承模式
1 原型链继承
#### ES6中通过原型继承多个引用类型的属性和方法,由于原型和实例的关系,即每个构造函数都有自己的原型对象,同时原型有一个属性指向构造函数,并且实例有一个内部的指针指向原型。如果存在某原型是另一个类型的实例时,以此类推。便形成了原型链。
-实现原型链的基本代码模式:
function SubType(){}
SubType.prototype.getValue = function(){}
此时,函数SubType的原型上边定义了一个方法 getValue 在下一步进行实例化的时候,便可以通过这个方法访问函数上的相关属性。
同时,一个函数或者方法的原型可以继承自另外一个函数或者类的实例。
例如:
function SonType(){}
继承自SubType
SonType.prototype = new SubType();
读取实例上的属性的原则:首先会在实例上搜索这个属性,如果未找到,则会搜索继承实例的原型,以此向上,搜索原型的原型。一直持续到原型链的末端。
2 盗用构造函数实现继承
改继承方式可以解决原型包含引用值导致的继承问题,(即可能会导致实现多个不必要的引用或者方法)。
例:
function SuperType(){
this.color = ['red','blue','green']
}
继承自SuperType
function SubType(){ SuperType.call(this) }
let instance = new SubType();
instance.color.push("skyblue)
console.log(instance.color)
red,blue,green,skyblue
;
上述代码展示了盗用构造函数的调用,通过使用call或者apply方法SuperType构造函数能够在实例化SubType的实例时,在其新对象的上下文中执行。
此种方式的优点在于能够在子类的构造函数当中向父类的构造函数传递参数。
SuperType.call(this,'此处传递参数')
缺点在于必须在构造函数中定义方法,函数无法重用,同时子类也无法访问父类原型上的定义的方法。
组合式继承模式
该继承综合了原型链和盗用构造函数继承:将优点集中到一起。
基本思路:通过原型链继承原型上的属性和方法,通过盗用构造函数继承实例属性。
实例代码:
function SuperType(){
this.name = name;
this.colors = ['red','blue','green']
}
SuperType.prototype.sayName = function(){
console.log(this.name)
}
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.ptototype = new SuperType();
SubType.prototype.sayAge = function(){
console.log(this.age)
}
该继承模式弥补了原型链继承和盗用构造函数继承的不足,是使用最多的继承模式,同时还保留了instanceof操作符和isPrototypeOf()方法。
原型式继承
function object(o) {
function F(){};
F.prototype = o;
return new F();
}
object函数会临时创建一个构造函数,将传入的对象赋值个这个构造函数的原型,最后返回这个临时类型的一个实例,本质上,相当于一次浅复制。
ES6中通过增加Object.create()方法实现原型式继承。该方法接收两个参数,1 作为新对象原型的对象。2 给新对象定义额外属性的对象。(可选)
当只有一个参数时,同上文定义的object函数功能相同。
寄生式继承
function createAnother(origin){
let clone = object(origin); 通过调用构造函数创建一个新对象 object函数和原型式继承类似
clone.sayname = function(){ 增强这个新对象的属性和方法
console.log("say hi")
}
return clone;
}
思路类似于:寄生构造函数和工厂模式。创建一个实现继承的函数,以某种方式增强这个对象,最后返回。
寄生式组合继承
组合继承示例:
function SuperType(name){
this.name = name;
this.colors = ['red','blue','green'];
}
SuperType.prototype.sayName = function(){
console.log(this.name);
}
function SubType(name,age){
SuperType.call(this,name); 第二次调用SuperType
this.age = age;
}
SubType.prototype = new SuperType();
第一次调用SuperType()
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
console.log(this.age);
}
寄生式组合继承
function inheritPrototype(subType,superType){
let prototype = object(superType.prototype); 创建对象
prototype.constructor = subType(); 增强对象
subType.prototype = prototype; 赋值对象
}
通过这种方式 只需要调用一次SuperType构造函数效率更高,原型键依然保持不变,同时instance操作符和isProtoTpe方法正常有效。
一文详解JavaScript的继承模式的更多相关文章
- 详解Javascript的继承实现(二)
上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...
- 详解Javascript的继承实现
我最早掌握的在js中实现继承的方法是在w3school学到的混合原型链和对象冒充的方法,在工作中,只要用到继承的时候,我都是用这个方法实现.它的实现简单,思路清晰:用对象冒充继承父类构造函数的属性,用 ...
- 详解JavaScript对象继承方式
一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数成为 Children 的方法,然 ...
- 【转】详解JavaScript中的this
ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- (转载)详解Javascript中prototype属性(推荐)
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- 详解javascript的类
前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...
- 一文详解Hexo+Github小白建站
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
- 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...
随机推荐
- iOS-block循环引用详解和应用
Block循环引用 什么情况下block会造成循环引用 ARC 情况下 block为了保证代码块内部对象不被提前释放,会对block中的对象进行强引用,就相当于持有了其中的对象,而如果此时block中 ...
- 利用Nginx实现反向代理web服务器
一.Nginx简介 Nginx是一个很强大的高性能Web服务器和反向代理服务器,它具有很多非常优越的特性: 可以高并发连接 内存消耗少 成本低廉 配置文件非常简单 支持Rewrite重写 内置的健康检 ...
- E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)E: Unable to l ...
- MySQL05
SQL字段相关语句 添加字段 alter table 表名 add 字段名 数据类型 约束条件; 修改字段 alter table 表名 modify 字段 数据类型 约束条件; # modify只能 ...
- luoguP2601 对称的正方形
题目描述 给出一个数字矩形,求这个矩形中有多少个子正方形满足上下对称.左右对称. 思路 我们可以用3个哈希数组 \(a\ b\ c\) 分别表示矩形从左上往右下看,从左下往右上看,从右上往左下看的样子 ...
- COM笔记-COM库函数
COM在OLE32.DLL和 OLE32.LIB定义了一些常用的函数.在使用这些函数前要先调用CoInitialize来初始化COM库.当进程不再需要使用COM库函数时要调用CoUninitializ ...
- ASP net core面试题汇总及答案
在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉.有三种服务的生命周期. 单实例服务, 通过add singleton方法来添加.在注册时即创建服务, 在随后的请 ...
- spring boot 2.0.0 + shiro + redis实现前后端分离的项目
简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大 ...
- Linux centos 安装 jenkins & 本地构建jar & 远程构建jar
一.部署 jenkins 需要的前奏 1.安装 JDK:https://www.cnblogs.com/chuyi-/p/10644440.html 2.安装tomcat:https://www.cn ...
- 如何将excel中纵向的转换成横向保证格式不变,
先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下