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 相关文章推荐
很可爱的输入框
Aug 03 Javascript
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
javascript中检测变量的类型的代码
Dec 28 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
JavaScript代码复用模式实例分析
Dec 02 Javascript
实测jquery data()如何存值
Aug 18 Javascript
Bootstrap Img 图片样式(推荐)
Dec 13 Javascript
谈谈jQuery之Deferred源码剖析
Dec 19 Javascript
JS正则表达式验证密码格式的集中情况总结
Feb 23 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
Nov 30 Javascript
JavaScript实现的拼图算法分析
Feb 13 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
实现树状结构的两种方法
2006/10/09 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
食品安全检查制度
2014/02/03 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
自主招生学校推荐信
2014/09/26 职场文书
部门2015年度工作总结
2015/04/29 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL
MySQL深分页问题解决思路
2022/12/24 MySQL