基于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 相关文章推荐
DIV菜单层实现代码
Nov 19 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
Aug 04 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
jQuery拖拽通过八个点改变div大小
Nov 29 Javascript
bootstrap confirmation按钮提示组件使用详解
Aug 22 Javascript
js 取消页面可以选中文字的功能方法
Jan 02 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
checkbox在vue中的用法小结
Nov 13 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 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数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
深入php self与$this的详解
2013/06/08 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python django 访问静态文件出现404或500错误
2017/01/20 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
python super用法及原理详解
2020/01/20 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
英国足球店:UK Soccer Shop
2017/11/19 全球购物
两道JAVA笔试题
2016/09/14 面试题
计算机个人求职信范例
2014/01/24 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android