关于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 相关文章推荐
找到了一篇jQuery与Prototype并存的冲突的解决方法
Aug 29 Javascript
js中判断控件是否存在
Aug 25 Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
JavaScript中两种链式调用实现代码
Jan 12 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
Apr 30 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
一个可复用的vue分页组件
May 15 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
node实现socket链接与GPRS进行通信的方法
May 20 Javascript
微信小程序自定义tabBar在uni-app的适配详解
Sep 30 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图片上传程序
2008/03/27 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
PHP编程函数安全篇
2013/01/08 PHP
PHP5.3新特性小结
2016/02/14 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
Python实现字符串格式化输出的方法详解
2017/09/20 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
python实现多线程端口扫描
2019/08/31 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
个人教师自我评价范文
2013/12/02 职场文书
黄河的主人教学反思
2014/02/07 职场文书
解除租房协议书
2014/12/03 职场文书
2015元旦节寄语
2014/12/08 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL