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 相关文章推荐
jquery 日期分离成年月日的代码
May 14 Javascript
javascript 隔行换色函数代码
Oct 24 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
JS通过相同的name进行表格求和代码
Aug 18 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
微信小程序登录态控制深入分析
Apr 12 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
详解vue中computed 和 watch的异同
Jun 30 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
微信小程序实现弹出层效果
May 26 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
PHP 全角转半角实现代码
2010/05/16 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python入门教程之if语句的用法
2015/05/14 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
python中append函数用法讲解
2020/12/11 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
市场开发与营销专业求职信
2013/12/31 职场文书
出国导师推荐信
2014/01/16 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
文明寝室标语
2014/06/13 职场文书
教师师德师风整改措施
2014/10/24 职场文书
解除处分决定书
2015/06/25 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫