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计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
各浏览器对document.getElementById等方法的实现差异解析
Dec 05 Javascript
window.location 对象所包含的属性
Oct 10 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 Javascript
angular.element方法汇总
Jan 07 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
Mar 08 Javascript
vue-router项目实战总结篇
Feb 11 Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 Javascript
layui动态渲染生成select的option值方法
Sep 23 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
JavaScript执行机制详细介绍
Dec 06 Javascript
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/01 无线电
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
简单理解Python中的装饰器
2015/07/31 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python3实现飞机大战游戏
2020/04/24 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
房地产融资计划书
2014/01/10 职场文书
校本教研活动总结
2014/07/01 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
教师考核表个人总结
2015/02/12 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
Vue监视数据的原理详解
2022/02/24 Vue.js