基于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 相关文章推荐
javascript[js]获取url参数的代码
Oct 17 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
Mar 16 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
基于zepto的移动端轻量级日期插件--date_picker
Mar 04 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 Javascript
JS获取url参数、主域名的方法实例分析
Aug 03 Javascript
vue中axios的二次封装实例讲解
Oct 14 Javascript
Vue-cli项目部署到Nginx服务器的方法
Nov 01 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 Javascript
使用compose函数优化代码提高可读性及扩展性
Jun 16 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
PHP+javascript液晶时钟
2006/10/09 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
Node.js实现文件上传
2016/07/05 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python微信库:itchat的用法详解
2017/08/14 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
经典c++面试题五
2014/12/17 面试题
生物技术专业毕业生求职信范文
2013/12/14 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
工程资料员岗位职责
2014/03/10 职场文书
地理教师岗位职责
2014/03/16 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
招标保密承诺书
2015/01/20 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
windows server2008 开启端口的实现方法
2022/06/25 Servers