浅谈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 相关文章推荐
不懂JavaScript应该怎样学
Apr 16 Javascript
javascript学习笔记(九) js对象 设计模式
Jun 19 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
Jan 11 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 Javascript
详解Node.js实现301、302重定向服务
Apr 07 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
详解JavaScript作用域和作用域链
Mar 19 Javascript
vue使用video插件vue-video-player的示例
Oct 03 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python Pillow图像处理方法汇总
2019/10/16 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
Python如何测试stdout输出
2020/08/10 Python
法国在线药房:1001Pharmacies
2021/03/07 全球购物
中科方德软件测试面试题
2016/04/21 面试题
医药专业应届毕业生求职信范文
2014/01/01 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS