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 相关文章推荐
监控 url fragment变化的js代码
Apr 19 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
Oct 24 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
jQuery如何取id有.的值一般的方法是取不到的
Apr 18 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
微信小程序 swiper制作tab切换实现附源码
Jan 21 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
Sep 14 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
详解js访问对象的属性和方法
Oct 25 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
Jul 20 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
详解vue 组件注册
2020/11/20 Vue.js
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python3实现名片管理系统
2020/11/29 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
八一演出活动方案
2014/02/03 职场文书
地球一小时倡议书
2014/04/15 职场文书
售后服务承诺书模板
2014/05/21 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
增值税发票丢失证明
2015/06/19 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
合作意向书怎么写
2019/06/24 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Nginx源码编译安装过程记录
2021/11/17 Servers
python超详细实现完整学生成绩管理系统
2022/03/17 Python