浅谈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 RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
js判断横竖屏及禁止浏览器滑动条示例
Apr 29 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
Angular.JS学习之依赖注入$injector详析
Oct 20 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
Jan 23 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
H5图片压缩与上传实例
Apr 21 Javascript
关于react-router的几种配置方式详解
Jul 24 Javascript
原生JS实现的雪花飘落动画效果
May 03 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 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代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
js转义字符介绍
2013/11/05 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
python/golang 删除链表中的元素
2020/09/14 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
最新的互联网创业计划书
2014/01/10 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
读群众路线心得体会
2014/03/07 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
机关单位动员会主持词
2014/03/20 职场文书
讲座主持词
2014/03/20 职场文书
党员承诺书格式
2014/05/21 职场文书
民族精神月活动总结
2014/08/28 职场文书