基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解


Posted in Javascript onMay 07, 2013

构造函数、原型实现继承的缺陷

首先来分析构造函数和原型链两种实现继承方式的缺陷:

构造函数(对象冒充)的主要问题是必须使用构造函数方式,且无法继承通过原型定义的方法,这不是最好的选择。不过如果使用原型链,就无法使用带参数的构造函数了。开发者如何选择呢?答案很简单,两者都用。

构造函数+原型混合方式

这种继承方式使用构造函数定义类,并非使用任何原型。创建类的最好方式是用构造函数定义属性,用原型定义方法。这种方式同样适用于继承机制,用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。用这两种方式重写前面的例子,代码如下:

function ClassA(sColor) {
    this.color = sColor;
}
ClassA.prototype.sayColor = function () {
    alert(this.color);
};
function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function () {
    alert(this.name);
};

在此例子中,继承机制由两行突出显示的蓝色代码实现。在第一行突出显示的代码中,在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性。在第二行突出显示的代码中,用原型链继承 ClassA 类的方法。由于这种混合方式使用了原型链,所以 instanceof 运算符仍能正确运行。

下面的例子测试了这段代码:

var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();    //输出 "blue"
objB.sayColor();    //输出 "red"
objB.sayName();    //输出 "John"

Javascript 相关文章推荐
基于jquery的$.ajax async使用
Oct 19 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
Jquery为a标签的href赋值实现代码
May 03 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
原生javascript实现的分页插件pagenav
Aug 28 Javascript
JavaScript 常见安全漏洞和自动化检测技术
Aug 21 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
Feb 18 Javascript
js replace 全局替换的操作方法
Jun 12 Javascript
js实现筛选功能
Nov 24 Javascript
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
原生js中运算符及流程控制示例详解
Jan 05 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 #Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
May 07 #Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 #Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
May 07 #Javascript
jQuery的slideToggle方法实例
May 07 #Javascript
jQuery实现动画效果的实例代码
May 07 #Javascript
nullJavascript中创建对象的五种方法实例
May 07 #Javascript
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python获取命令行输入参数列表的实例代码
2018/06/23 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
python实现一组典型数据格式转换
2018/12/15 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
python字符串Intern机制详解
2019/07/01 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
教学个人的自我评价分享
2014/02/16 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
学习张林森心得体会
2014/09/10 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
Python时间操作之pytz模块使用详解
2022/06/14 Python