JavaScript 实现继承的几种方式


Posted in Javascript onFebruary 19, 2021

非ES6代码实现继承的主流方式主要可以分为:
构造继承、原型链继承、构造继承+原型链继承组合继承、以及在组合继承上衍生出的继承方式。

构造继承 (借助call实现)

实现

function Super(age){
 this.age = age;
 this.say = function(){
 console.log(this.age)
 }
}
function Child(name,age){
 Super.call(this,age)
 this.name = name;
}
var child = new Child("min",23)
console.log(child instanceof Super); // false
console.log(child instanceof Child); // true

优点

(1) 可以实现多继承(call多个父类对象)
(2) 构造函数中可向父级传递参数

缺点

(1) 只能继承父类实例的属性和方法,不能继承原型上的属性和方法
(2) 实例并不是父类的实例,只是子类的实例

原型链继承 (借助原型链实现)

实现

function Super(){
 this.getName = function(){
 console.log(this.name)
 }
}
function Child(name){
	this.name = name;
}
Child.prototype = new Super(); // 这里可以传构造参数
Child.prototype.constructor = Child;
var child = new Child("min");
console.log(child instanceof Super); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // Child

优点
(1) 父类原型属性与方法,子类都能访问到
(2) 实例是子类的实例,也是父类的实例

缺点
(1) 无法实现多继承 (2) 创建子类实例时,无法向父类构造函数传参

组合继承 (构造继承+原型链继承)

实现

function Super(age){
 this.age = age;
 this.getAge = function(){
 console.log(this.age);
 }
}
function Child(name,age){
 Super.call(this,age)
 this.name = name;
}
Child.prototype = new Super(1); 
Child.prototype.constructor = Child;
var child = new Child("min",23);
console.log(child instanceof Super); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // Child

优点
(1) 结合了构造+原型链继承的优点

缺点
(1) Child.prototype = new Super(); 多调用了一次,使得原型对象中存在一些不必要属性,如上面例子中age属性

寄生组合继承

实现

function Super(age){
 this.age = age;
 this.getAge = function(){
 console.log(this.age)
 }
}
function Child(name,age){
 Super.call(this,age)
 this.name = name;
}
(function(){
 function Copy(){}
 Copy.prototype = Super.prototype;
 Child.prototype = new Copy();
})()
Child.prototype.constructor = Child;
var child = new Child("min",23);

备注
问:为什么没有直接使用 Child.prototype = Super.prototype;
答:Child.prototype.constructor = Child;关键代码,上面写Super.prototype 也会变(引用类型,指向同一地址)

优点
(1) 这应该是实现继承最完美的方案了,es6的extends关键字,在babel转换后代码也是通过这种方式实现的继承。

额外:借助(Object.create)

实现

function Super(age){
 this.age = age;
 this.getAge = function(){
 console.log(this.age)
 }
}
function Child(name,age){
 Super.call(this,age)
 this.name = name;
}
Child.prototype = Object.create(Super.prototype,{
 constructor:{ // 构造函数修复
 value: Child
 }
})
var child = new Child("min",23);
console.log(child instanceof Super); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // Child

以上就是JavaScript 实现继承的几种方式的详细内容,更多关于JavaScript 实现继承的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript之更有效率的字符串替换
Aug 02 Javascript
jquery CSS选择器笔记
Mar 29 Javascript
Javascript中valueOf与toString区别浅析
Mar 19 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
JavaScript修改css样式style动态改变元素样式
Dec 16 Javascript
JS数组操作中的经典算法实例讲解
Jul 26 Javascript
select标签设置默认选中的选项方法
Mar 02 Javascript
js中的闭包实例展示
Nov 01 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
JS用最简单的方法实现四舍五入
Aug 27 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 #Javascript
JavaScript实现打字游戏
Feb 19 #Javascript
JS+CSS实现动态时钟
Feb 19 #Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 #Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 #Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 #Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 #Vue.js
You might like
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js对象数组按属性快速排序
2011/01/31 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
python自动化unittest yaml使用过程解析
2020/02/03 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
python3.7调试的实例方法
2020/07/21 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
Python实现微信表情包炸群功能
2021/01/28 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
干货!开幕词的写作方法
2019/04/02 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android