JavaScript 原型继承之构造函数继承


Posted in Javascript onAugust 26, 2011

上回说到《JavaScript 原型继承之基础机制》,这一篇将具体说说构造函数的继承。

从一个简单的示例开始,创建描述人类的 People 构造函数:

function People(){ 
this.race = '愚蠢的人类'; 
}

然后,创建描述黄种人的 Yellow 构造函数:
function Yellow(name, skin){ 
this.name = name; 
this.skin = skin; 
}

要使得黄种人 Yellow 能继承人类 People 对象,在 JavaScript 中可以通过多种方式模拟实现。

1、对象冒充(Object Masquerading)

对象冒充,简单地说就是把一个定义抽象类的构造函数当作常规函数使用,实现伪继承:

function Yellow(name, skin) { 
this._extend = People; 
this._extend(); 
delete this._extend; //删除对 People 的引用 
this.name = name; 
this.skin = skin; 
} 
//实例化 yellow1 
var yellow1 = new Yellow('小明', '黄皮肤'); 
console.log(yellow1.name); //小明 
console.log(yellow1.race); //愚蠢的人类

在这段代码中,为 Yellow 添加私有方法 _extend,由于函数本身只是以引用的形式存在,执行时会自动调用 People方法,并传入 Yellow 构造函数的 name 参数。而 Yellow 对象的自身属性和方法,必须在上述过程结束,清空对外部方法的引用后再进行定义。

注:通过对象冒充可以实现多重继承

2、call / apply 方法

通过 call / apply 方法实现继承可能更为简单,不需要任何繁琐的操作:

function Yellow(name, skin) { 
People.apply(this, arguments); 
this.name = name; 
this.skin = skin; 
} 
//实例化 yellow2 
var yellow2 = new Yellow('大卫', '黑皮肤') 
console.log(yellow2.name); //大卫 
console.log(yellow2.race); //愚蠢的人类 
这里为 apply 传入 arguments 数组,也可以使用 new Array 或字面量数组。

3、原型链(Prototype Chaining)

第一种原型继承方法是把对象的原型指向父类的某个实例:

Yellow.prototype = new People(); 
Yellow.prototype.constructor = Yellow; //初始的 prototype 被完全清空,所以最好将 constructor 重置 
var yellow3 = new Yellow('小王', '黄皮肤'); 
console.log(yellow3.race); //愚蠢的人类

以上代码可以这样反向理解,yellow3 实例本身找不到 race 属性,而它原型上的 race 属性又恰好是 People 对象的实例的 race 属性。

如果对于 People 对象来说,其属性写入了原型中,则无需实例化,只需将 Yellow 的 prototype 属性指向 People的 prototype 属性:

function People(){}; 
People.prototype.race = '愚蠢的人类'; 
Yellow.prototype = People.prototype; 
Yellow.prototype.constructor = Yellow;

这样做不进行实例化操作,只是指针的改变,非常环保。但由于引用类型的关系,Yellow 和 People 指向了同一个原型对象,也就是说对 Yellow.prototype.constructor 的修改实际上破坏了 People 的原型对象。

既然如此,可以借助一个空的中继对象,绕过父类的原型:

var F = function(){}; 
F.prototype = People.prototype; 
Yellow.prototype = new F(); 
Yellow.prototype.constructor = Yellow;
Javascript 相关文章推荐
jQuery 使用个人心得
Feb 26 Javascript
15 个 JavaScript Web UI 库
May 19 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
Oct 26 Javascript
javascript中window.event事件用法详解
Dec 11 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
jQuery检测输入的字符串包含的中英文的数量
Apr 17 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 Javascript
jQuery 3.0 的变化及使用方法
Feb 01 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
Mac系统下Webstorm快捷键整理大全
May 28 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
JavaScript原型继承之基础机制分析
Aug 26 #Javascript
自己动手开发jQuery插件教程
Aug 25 #Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
Aug 23 #Javascript
基于JQuery的Select选择框的华丽变身
Aug 23 #Javascript
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 #Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
Aug 23 #Javascript
jQuery页面滚动浮动层智能定位实例代码
Aug 23 #Javascript
You might like
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP整合PayPal支付
2015/06/11 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
简单谈谈javascript代码复用模式
2015/01/28 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Python爬取网页信息的示例
2020/09/24 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
省三好学生申请材料
2014/01/22 职场文书
毕业生求职信范文
2014/06/29 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
深入浅析Django MTV模式
2021/09/04 Python