基于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 相关文章推荐
js 幻灯片的实现
Dec 06 Javascript
js自定义事件及事件交互原理概述(一)
Feb 01 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
完美解决js传递参数中加号和&号自动改变的方法
Oct 11 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
Vue中keep-alive组件的深入理解
Aug 23 Javascript
js实现鼠标切换图片(无定时器)
Jan 27 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
人族 TERRAN 概述
2020/03/14 星际争霸
使PHP自定义函数返回多个值
2006/11/26 PHP
请php正则走开
2008/03/15 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
用ADODB.Stream转换
2007/01/22 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
微信小程序 五星评价功能的实现
2017/03/09 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
js实现时间日期校验
2020/05/26 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Python字符串拼接六种方法介绍
2017/12/18 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
Python3 批量扫描端口的例子
2019/07/25 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
python如何建立全零数组
2020/07/19 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
益模软件Java笔试题
2012/03/27 面试题
办公室副主任岗位职责
2013/11/25 职场文书
大学班级学风建设方案
2014/05/01 职场文书
乒乓球比赛通知
2015/04/27 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js