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 typeof 用法
Dec 28 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
document节点对象的获取方式示例介绍
Dec 24 Javascript
JavaScript阻止浏览器返回按钮的方法
Mar 18 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
Bootstrap树形控件使用方法详解
Jan 27 Javascript
JS简单判断函数是否存在的方法
Feb 13 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 Javascript
vue3.0 数字翻牌组件的使用方法详解
Apr 20 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
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
js身份证验证超强脚本
2008/10/26 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
js实现小时钟效果
2020/03/25 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
英文简历中的自我评价
2013/10/06 职场文书
优秀学生获奖感言
2014/02/15 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
安全责任协议书范本
2016/03/23 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
导游词之湖北武当山
2019/09/23 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL