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与函数式编程解释
Apr 27 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
Jul 20 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
Nov 28 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
利用10行js代码实现上下滚动公告效果
Dec 08 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
jsonp跨域获取百度联想词的方法分析
May 13 Javascript
如何在JavaScript中谨慎使用代码注释
Jun 21 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 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中ini_set与ini_get用法实例
2014/11/04 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python中字符串的格式化方法小结
2016/05/03 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
python视频按帧截取图片工具
2019/07/23 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python函数不定长参数使用方法解析
2019/12/14 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
农村面貌改造提升实施方案
2014/03/18 职场文书
干部个人对照检查材料
2014/08/25 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
停课通知书
2015/04/24 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
Python 线程池模块之多线程操作代码
2021/05/20 Python
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Java常用函数式接口总结
2021/06/29 Java/Android
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫