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实现仿银行密码输入框效果的代码
Dec 13 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
javascript getElementsByTagName
Jan 31 Javascript
关于递归运算的顺序测试代码
Nov 30 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 Javascript
微信小程序实现聊天室
Aug 21 Javascript
如何利用node转发请求详解
Sep 17 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
获取远程文件大小的php函数
2010/01/11 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
requireJS使用指南
2016/04/27 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python生成随机验证码的两种方法
2015/12/22 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
Python反射用法实例简析
2017/12/22 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
如何理解Python中的变量
2020/06/01 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
接口的多继承会带来哪些问题
2015/08/17 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
大学生演讲稿范文
2014/01/11 职场文书
高中体育教学反思
2014/01/29 职场文书
给校长的建议书
2014/03/12 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
教师个人读书活动总结
2014/07/08 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
公司2015年终工作总结
2015/05/26 职场文书
安全温馨提示语大全
2015/07/14 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
Java实现多线程聊天室
2021/06/26 Java/Android
Spring实现内置监听器
2021/07/09 Java/Android
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript