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选项卡TAB示例代码
Aug 28 Javascript
node.js中的events.emitter.once方法使用说明
Dec 10 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
javascript获得当前的信息的一些常用命令
Feb 25 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
Jan 27 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
vue路由 遍历生成复数router-link的例子
Oct 30 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
原生Javascript+HTML5一步步实现拖拽排序
Jun 12 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创建图像具体步骤
2017/03/13 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
jscript读写二进制文件的方法
2015/04/22 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python制作刷网页流量工具
2017/04/23 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
简单实现python收发邮件功能
2018/01/05 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
单位介绍信范文
2014/01/18 职场文书
事务机电主管工作职责
2014/02/25 职场文书
总经理岗位职责
2015/02/04 职场文书
文员岗位职责范本
2015/04/16 职场文书
给朋友的赠语
2015/06/23 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Python必备技巧之字符数据操作详解
2022/03/23 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技