Javascript组合继承方法代码实例解析


Posted in Javascript onApril 02, 2020

Javascript组合继承方法代码实例解析

组合继承

组合继承,指将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。其背后思路使用用原型链实现对原型属性和方法的继承,而通过构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。

下面来看一个例子

function SuperType(name) {
  this.name = name;
  this.color = ['red', 'blue', 'green'];
};
//
SuperType.prototype.sayName = function() {
  console.log(this.name);
};
//
function SubType(name, age) {
  //继承属性
  SuperType.call(this, name);		// 第二次调用SuperType
//
  this.age = age;
};
//继承方法
SubType.prototype = new SuperType();	// 第一次调用SuperType
console.log(SubType.prototype.constructor); //输出SuperType函数的源码,即此时SubType.prototype.constructor指向SuperType函数
SubType.prototype.constructor = SubType; //将SubType.prototype.constructor指针指回SubType函数
SubType.prototype.sayAge = function() {
  console.log(this.age);
};
//
var instance1 = new SubType('Jake', 20)
instance1.color.push('black');
console.log(instance1.color); //'red,blue,green,black'
instance1.sayName(); //'Jake'
instance1.sayAge(); //20
//
var instance2 = new SubType('Greg', 21);
console.log(instance2.color); //'red,blue,green'
instance2.sayName(); //'Greg';
instance2.sayAge(); //21

观察输出结果,便可以发现:两个SubType实例(instance1和instance2)既分别有自己的属性,又可以使用相同的方法。

优点

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,所以是JS中最常用的继承模式。而且,instanceof和isPrototypeOf()也能够用于识别基于组合继承创建的对象。

缺点

调用两次SuperType构造函数

在SubType.prototype上创建了不必要的属性

寄生组合继承

function SuperType (name) {
 this.name = name
 this.colors = ['red', 'blue', 'yellow']
}

SuperType.prototype.sayName = function () {
 console.log(this.name)
}

function SubType (name, age) {
 SuperType.call(this, name) // 通过构造函数继承实例属性
 this.age = age
}

SubType.prototype = Object.create(SuperType.prototype)	//继承父类共享方法
SubType.prototype.constructor = SubType	//将SubType.prototype.constructor指针指回SubType函数
SubType.prototype.sayAge = function () {
 console.log(this.age)
}

let obj = new SubType('jake', 22)
obj.sayName()	// jake
obj.sayAge()	// 22
console.log(obj instanceof SubType)	// true
console.log(obj instanceof SuperType)	// true

优点

寄生组合继承只调用了一次SuperType,所以更高效

避免了在SubType.prototype上创建了不必要的属性

下面说说原型链和构造函数的缺点

原型链

缺点:当原型链中包含引用类型值时,原型属性会被所有实例共享;

下面看一个例子

function SuperType() {
  this.color = ['red', 'blue', 'green'];
}
//
function SubType() {};
//
SubType.prototype = new SuperType(); //继承了SuperType
//
var instance1 = new SubType();
instance1.color.push('black');
console.log(instance1.color);  //'red,blue,green,black'
//
var instance2 = new SubType();
console.log(instance2.color);  //'red,blue,green,black'

借用构造函数

缺点:如果仅仅使用构造函数,方法都在构造函数中定义,因此函数就无法实现复用了。而且,在超类型的原型中定义的方法,对于子类型而言也是不可见的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
几款极品的javascript压缩混淆工具
May 16 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
js Calender控件使用详解
Jan 05 Javascript
解决JS无法调用Controller问题的方法
Dec 31 Javascript
JS三级可折叠菜单实现方法
Feb 29 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 Javascript
AngularJS 验证码60秒倒计时功能的实现
Jun 05 Javascript
vue中将网页打印成pdf实例代码
Jun 15 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
Javascript异步编程async实现过程详解
Apr 02 #Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 #Javascript
JavaScript运动原理基础知识详解
Apr 02 #Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 #Javascript
webpack3.0升级4.0的方法步骤
Apr 02 #Javascript
Javascript模块化机制实现原理详解
Apr 02 #Javascript
sharp.js安装过程中遇到的问题总结
Apr 02 #Javascript
You might like
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php escape URL编码
2008/12/10 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
Python学习之asyncore模块用法实例教程
2014/09/29 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
历史教育专业个人求职信
2013/12/13 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
幼儿教育感言
2014/02/05 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
儿童生日会策划方案
2014/05/15 职场文书
搬迁通知
2015/04/20 职场文书
文明上网主题班会
2015/08/14 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书