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 LigerUI 使用教程入门篇
Jan 18 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
Apr 23 Javascript
script不刷新页面的联动前后代码
Sep 18 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
Nov 02 Javascript
微信小程序实现实时圆形进度条的方法示例
Feb 24 Javascript
javascript流程控制语句集合
Sep 18 Javascript
微信小程序npm引入vant-weapp的踩坑记录
Aug 01 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
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-app开发接口加密详解
2018/04/18 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
angular2使用简单介绍
2016/03/01 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
node.js中使用Export和Import的方法
2017/09/18 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
Python实现的桶排序算法示例
2017/11/29 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Python中@property的理解和使用示例
2019/06/11 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
python实现连连看游戏
2020/02/14 Python
Python对wav文件的重采样实例
2020/02/25 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
央视元宵晚会主持串词
2014/03/25 职场文书
教师读书活动总结
2014/05/07 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python