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 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
JavaScript Promise启示录
Aug 12 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
原生js实现日期联动
Jan 12 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
Feb 15 Javascript
JavaScript中 this 指向问题深度解析
Feb 21 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
vant时间控件使用方法详解
Dec 24 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输出缓存ob系列函数详解
2014/03/11 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
jQuery Ajax使用 全解析
2010/12/15 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
JavaScript中的"=、==、==="区别讲解
2019/01/22 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python如何为图片添加水印
2016/11/25 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python模拟斗地主发牌
2020/04/22 Python
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
《火烧云》教学反思
2014/04/12 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
教师师德表现自我评价
2015/03/05 职场文书
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python