基于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 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
Feb 23 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
Dec 01 Javascript
5分钟快速看懂ES6中的反射与代理
Dec 19 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
使用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实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php上传文件常见问题总结
2015/02/03 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
python实现的udp协议Server和Client代码实例
2014/06/04 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
家长对小学生的评语
2014/01/28 职场文书
应届大专生自荐书
2014/06/16 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
总经理岗位职责
2015/02/04 职场文书
社区文明倡议书
2015/04/28 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL