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获取页面上某个元素的代码
Mar 13 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
Jul 31 Javascript
了解了这些才能开始发挥jQuery的威力
Oct 10 Javascript
浅析js设置控件的readonly与enabled属性问题
Dec 25 Javascript
js 本地预览的简单实现方法
Feb 18 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
Aug 06 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
js简单实现网页换肤功能
Apr 07 Javascript
将 vue 生成的 js 上传到七牛的实例
Jul 28 Javascript
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
浅谈微信JS-SDK 微信分享接口开发(介绍版)
Aug 15 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格式输出文件var_export函数实例
2014/11/15 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
js实现中文实时时钟
2020/01/15 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
Python脚本处理空格的方法
2016/08/08 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Python实现图片识别加翻译功能
2019/12/26 Python
Python @property装饰器原理解析
2020/01/22 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
使用python实现名片管理系统
2020/06/18 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
法人代表委托书
2014/04/04 职场文书
老公给老婆的保证书
2014/04/28 职场文书
任命书怎么写
2014/06/04 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
初二学生评语大全
2014/12/26 职场文书
公司搬迁通知
2015/04/20 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server