浅谈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 相关文章推荐
利用js读取动态网站从服务器端返回的数据
Feb 10 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
Jul 06 Javascript
JavaScript实现简单Tip提示框效果
Apr 20 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
May 27 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
完美解决input[type=number]无法显示非数字字符的问题
Feb 28 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
bootstrap select下拉搜索插件使用方法详解
Nov 23 Javascript
setTimeout时间设置为0详细解析
Mar 13 Javascript
解决webpack dev-server不能匹配post请求的问题
Aug 24 Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
2021年最新CPU天梯图
2021/03/04 数码科技
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python破解zip加密文件的方法
2018/05/31 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
internal修饰符起什么作用
2013/12/16 面试题
护士自荐信范文
2013/12/15 职场文书
政府信息公开实施方案
2014/05/09 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
裁员通知
2015/04/25 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书