浅谈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 相关文章推荐
地址栏上的一段语句,改变页面的风格。(教程)
Apr 02 Javascript
各种效果的jquery ui(接口)介绍
Sep 17 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
Sep 29 Javascript
javascript 获取表单file全路径
Dec 31 Javascript
解析瀑布流布局:JS+绝对定位的实现
May 08 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
javascript数组随机排序实例分析
Jul 22 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 Javascript
layui 表单标签的校验方法
Sep 04 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中json_decode()和json_encode()的使用方法
2012/06/04 PHP
php数组删除元素示例
2014/03/21 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
2015/05/25 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python实现比较两段文本不同之处的方法
2015/05/30 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Python如何重新加载模块
2020/07/29 Python
运行Python编写的程序方法实例
2020/10/21 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
数据库基础的一些面试题
2012/02/25 面试题
单位推荐信范文
2015/03/27 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
外出培训学习心得体会
2016/01/18 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
python双向链表实例详解
2022/05/25 Python