关于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 相关文章推荐
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
Javascript单例模式的介绍和实例
Oct 08 Javascript
Javascript使用uploadify来实现多文件上传
Nov 16 Javascript
React学习笔记之条件渲染(一)
Jul 02 Javascript
webpack配置导致字体图标无法显示的解决方法
Mar 06 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 Javascript
原生js实现贪食蛇小游戏的思路详解
Nov 26 Javascript
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
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
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
python编程羊车门问题代码示例
2017/10/25 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
在双python下设置python3为默认的方法
2018/10/31 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
Python列表list操作相关知识小结
2020/01/29 Python
jupyter notebook实现显示行号
2020/04/13 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
教师节横幅标语
2014/10/08 职场文书
劳模先进事迹材料
2014/12/24 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery