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 tools之tooltip
Jul 25 Javascript
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
Tab切换组件(选项卡功能)实例代码
Nov 21 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
利用Jquery实现可多选的下拉框
Feb 21 Javascript
Jquery $when done then的用法详解
May 20 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
利用vueJs实现图片轮播实例代码
Jun 03 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
Jul 11 Javascript
vue中路由参数传递可能会遇到的坑
Dec 07 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
Aug 19 Javascript
jQuery实现开关灯效果
Aug 02 jQuery
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 多线程上下文中安全写文件实现代码
2009/12/28 PHP
PHP实现的购物车类实例
2015/06/17 PHP
php算法实例分享
2015/07/14 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
vue.js表格分页示例
2016/10/18 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
python 运算符 供重载参考
2009/06/11 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
农业大学毕业生的个人自我评价
2013/10/11 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
后天观后感
2015/06/08 职场文书
车位出租协议书范本
2016/03/19 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS