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系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
jquery插件Jplayer使用方法简析
Apr 22 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
Vue中的混入的使用(vue mixins)
Jun 01 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
Angular2 自定义表单验证器的实现方法
Dec 14 Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
Oct 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中文件上传的一个问题
2010/09/04 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
pandas 根据列的值选取所有行的示例
2018/11/07 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
Django 路由层URLconf的实现
2019/12/30 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
心得体会范文
2014/01/04 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android