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实现动态增加删除表格行(兼容IE/FF)
Apr 02 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
多引号嵌套的变量命名的问题
May 09 Javascript
js闭包实例汇总
Nov 09 Javascript
JavaScript变量声明详解
Nov 27 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
Jul 07 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
Jul 27 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
vue 2.x 中axios 封装的get 和post方法
Feb 28 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 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
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
CI框架常用函数封装实例
2016/11/21 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python学习手册中的python多态示例代码
2014/01/21 Python
python实现祝福弹窗效果
2019/04/07 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
个人能力自我鉴赏
2014/01/25 职场文书
设计师个人求职信范文
2014/02/02 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
节水倡议书
2015/01/19 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python