关于JavaScript中原型继承中的一点思考


Posted in Javascript onJuly 25, 2012

我们先看一段传统的继承代码:

//定义超类 
function Father(){ 
this.name = "父亲"; 
} 
Father.prototype.theSuperValue = ["NO1","NO2"]; 
//定义子类 
function Child(){ 
} 
//实现继承 
Child.prototype = new Father(); 
//修改共享数组 
Child.prototype.theSuperValue.push("修改"); 
//创建子类实例 
var theChild = new Child(); 
console.log(theChild.theSuperValue); //["NO1","NO2","修改"] 
//创建父类实例 
var theFather = new Father(); 
console.log(theFather.theSuperValue); //["NO1","NO2","修改"]

通过上面的代码,我们注意“加红”的代码,子类Child的原型对象是父类Father的一个实例(new Father()),我们在这里是调用new Father()对象中的theSuperValue属性,因为new Father()对象中没有此属性(只有name属性),因此会沿着原型链向它的原型对象(Father.prototype)中去找,找到后发现是一个数组,而且是引用类型,此时我们往此数组中添加一个字符串“修改”。

之后,我们新建了Child的实例对象theChild,当theChild调用theSuperValue属性时,首先它自己里面没有此属性,就会去它的原型对象(new Father)中去找,可惜这里也没有,接着会到new Father()的原型中去找,OK,在Father.prototype中找到了这个数组,发现是["NO1","NO2","修改"]。

再接着,我们创建了Father的实例对象theFather,同上,我们在Father.prototype中找到了这个引用类型的数组["NO1","NO2","修改"]。(当然,数组都是引用类型的!)

通过上面的赘述,本来已经理解原型链概念的朋友觉得是废话连篇,其实我也是呵呵,接下来我们再看一个相似的例子:

//定义超类 
function Father() { 
this.name = "父亲"; 
} 
Father.prototype.theSuperValue = ["NO1", "NO2"]; 
//定义子类 
function Child() { 
} 
//实现继承 
Child.prototype = new Father(); 
//修改共享数组 
Child.prototype.theSuperValue = ["我是覆盖代码"] 
//创建子类实例 
var theChild = new Child(); 
console.log(theChild.theSuperValue); 
//创建父类实例 
var theFather = new Father(); 
console.log(theFather.theSuperValue);

我们看一下上面的代码,我用一种比较特别的紫色标注了此段代码与上段代码的小小区别,但结果却发生了“巨大”变化,见下面的截图:

关于JavaScript中原型继承中的一点思考

为什么我说是巨大变化,是因为我们从“重用公共属性”过渡到“覆盖公共属性,建立自己特色属性”上来!我这里是用数组演示的,其实第二种情况常常用在Function中,用子类的方法来覆盖父类的方法。

在第二段代码中,我们需要关注的是紫色代码前的“=”号,它是赋值操作符。如果我们对Child.prototype及new Father()对象调用这个赋值操作符时,我们就在这个对象上“新建”了一个属性,当在下面的theChild实例上调用theSuperValue时,返回的当然是新属性值["我是覆盖代码"]。

但当我们新创建一个父类实例theFather对象时,调用该对象上的theSuperValue属性,我们就会发现对象上并没有啊,这是为什么呢?因为我们刚才覆盖的是Father对象new Father();而不是Father类,所以,通过Fater()构造函数创建的新对象theFather并不包含新建的属性,当然,接下来的事情大家都明白,就是沿着原型链向上找,OK,在Father.prototype中找到了,就是我们一开始定义的那个数组。

通过上面两个例子,我们在JS中使用原型提供的继承功能时,尤其是利用子对象操作原型方法、对象时,切记“=”号赋值与引用调用这两种不同的操作,因为他们会带来完全不同的结果。

Javascript 相关文章推荐
javascript分页代码(当前页码居中)
Sep 20 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
下拉框select的绑定示例
Sep 04 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
JavaScript 数组的进化与性能分析
Sep 18 Javascript
在小程序Canvas中使用measureText的方法示例
Oct 19 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 Javascript
原生js 秒表实现代码
Jul 24 #Javascript
javascript设计模式 接口介绍
Jul 24 #Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 #Javascript
js+xml生成级联下拉框代码
Jul 24 #Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 #Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 #Javascript
基于JQuery的类似新浪微博展示信息效果的代码
Jul 23 #Javascript
You might like
PHP获取MAC地址的函数代码
2011/09/11 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
jquery中动态效果小结
2010/12/16 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
python实现ID3决策树算法
2017/12/20 Python
python实时监控cpu小工具
2018/06/21 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
英语自我评价范文
2014/01/24 职场文书
经济担保书范文
2014/04/02 职场文书
新品发布会主持词
2014/04/02 职场文书
积极向上的团队口号
2014/06/06 职场文书
黑白记忆观后感
2015/06/18 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
二胎满月酒致辞
2015/07/29 职场文书