浅谈JS继承_借用构造函数 & 组合式继承


Posted in Javascript onAugust 16, 2016

2.借用构造函数

为解决原型中包含引用类型值所带来的问题, 我们使用一种叫做 借用构造函数(constructor stealing)的技术(又叫伪造对象或经典继承)。

这种技术的基本思想:在子类构造函数内部调用超类型构造函数。

通过使用apply()和call()方法可以在新创建的子类对象上执行构造函数。

function SuperType(){
  this.colors = ["red", "blue", "green"];
}

function SubType(){
  //继承了 SuperType
  SuperType.apply(this);
}

var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors);  //red,blue,green,black

var instance2 = new SubType();
alert(instance2.colors);  //red,blue,green

在上述例子中,实际上是在新创建的SubType实例(instance1 instance2)的环境下调用了SuperType的构造函数。这样一来,就会在新SubType对象上执行SuperType()函数中定义的所有对象初始化代码。 所以Subtype的每个实例就都会具有自己的colors属性的副本了。

传递参数

对于原型链来讲,借用构造函数有一个很大的优势,即可以在子类型构造函数中想超类型构造函数传递参数。

function SuperType(name){
  this.name = name;
}

function SubType(){
  SuperType.call(this, "Bob");
  this.age = 18;
}

var instance1 = new SubType();
alert(instance1.age);  //18
alert(instance1.name);  //Bob

借用构造函数的问题:

方法都在构造函数中定义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的。

3. 组合继承

组合继承(combination inheritance), 有时候也叫作伪经典继承, 指的是将原型链和借用构造函数的技术组合到一起。从而发挥二者之长的一种继承模式。

使用原型链实现对原型属性和方法的继承;

通过借用构造函数来实现对实例属性的继承。

这样,既通过在原型上定义方法实现了函数的复用,又能保证每个实例都有他自己的属性。

function SuperType(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
  alert(this.name);
}

function SubType(name, age){

//继承属性
  SuperType.call(this, name);
  this.age = age;
}


//继承方法
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
  alert(this.age);
}

var instance1 = new SubType("Bob", 22);
instance1.colors.push("black");
alert(instance1.colors);   //red,blue,green,black
instance1.sayName();     //Bob
instance1.sayAge();     //22

var instance2 = new SubType("Alice", 21);
alert(instance2.colors);  //red,blue,green
instance2.sayName();    //Alice
instance2.sayAge();     //21

在这个例子中, SuperType构造函数定义了两个属性: name和colors。 SuperType的原型定义了一个方法sayName()。

SubType构造函数在调用SuperType构造函数时传入了name参数,定义了他自己的属性age。然后将SuperType的实例赋值给SubType的原型。在该原型上定义了方法sayAge()。

这样一来,就可以让两个不同的SubType实例既分别拥有自己的属性 - 包括colors属性,又可以使用相同的方法。

以上这篇浅谈JS继承_借用构造函数 & 组合式继承就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 常见学习网站与参考书
Nov 09 Javascript
js精度溢出解决方案
Dec 02 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
理解javascript中的严格模式
Feb 01 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
解读ES6中class关键字
Nov 20 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
Vue中的Props(不可变状态)
Sep 29 Javascript
详解Vue中组件的缓存
Apr 20 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
JS读写CSS样式的方法汇总
Aug 16 #Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
Aug 16 #Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 #Javascript
jQuery3.0中的buildFragment私有函数详解
Aug 16 #Javascript
js 自带的 map() 方法全面了解
Aug 16 #Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 #Javascript
js 自带的sort() 方法全面了解
Aug 16 #Javascript
You might like
配置PHP使之能同时支持GIF和JPEG
2006/10/09 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python 常用string函数详解
2016/05/30 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
机关财务管理制度
2014/01/17 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
创业资金计划书
2014/02/06 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
商场促销活动策划方案
2014/08/18 职场文书
投标承诺函格式
2015/01/21 职场文书
python 命令行传参方法总结
2021/05/25 Python