基于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 相关文章推荐
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 Javascript
javascript 打印页面代码
Mar 24 Javascript
jQuery修改CSS伪元素属性的方法
Jul 30 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
跟我学习javascript的undefined与null
Nov 17 Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
JS实现图片切换特效
Dec 23 Javascript
vue-video-player视频播放器使用配置详解
Oct 23 Javascript
vue-amap根据地址回显地图并mark的操作
Nov 03 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
Javascript 继承机制的实现
2009/08/12 Javascript
XENON基于JSON变种
2010/07/27 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
django迁移数据库错误问题解决
2019/07/29 Python
利用python计算时间差(返回天数)
2019/09/07 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
2014年两会学习心得体会
2014/03/17 职场文书
中层干部竞聘演讲稿
2014/05/15 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS