浅谈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的AngularJS库制作电子名片的方法
Jun 18 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
Jan 26 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
基于jQuery实现一个marquee无缝滚动的插件
Mar 09 Javascript
用react-redux实现react组件之间数据共享的方法
Jun 08 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
JavaScript this绑定过程深入详解
Dec 07 Javascript
生产制造追溯系统之再说条码打印
Jun 03 Javascript
Flutter实现仿微信底部菜单栏功能
Sep 18 Javascript
vue实现公告栏文字上下滚动效果的示例代码
Jun 16 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 23 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防止网站被刷新的方法汇总
2014/12/01 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Python编写一个闹钟功能
2017/07/11 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
Python实现序列化及csv文件读取
2020/01/19 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
C语言面试题
2013/05/19 面试题
静态变量和实例变量的区别
2015/07/07 面试题
个人债务授权委托书
2014/10/17 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书