关于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 相关文章推荐
用htc组件制作windows选项卡
Jan 13 Javascript
Javascript面向对象扩展库代码分享
Mar 27 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
Mar 01 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
微信小程序 自定义弹窗实现过程(附代码)
Dec 05 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
超详细小程序定位地图模块全系列开发教学
Nov 24 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
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
python结合API实现即时天气信息
2016/01/19 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
基于python 取余问题(%)详解
2020/06/03 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
口头翻译求职人自荐信
2013/12/07 职场文书
法律进社区实施方案
2014/03/21 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
离婚协议书范文2015
2015/01/26 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
如何用Python搭建gRPC服务
2021/06/30 Python
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技