关于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 相关文章推荐
DIY jquery plugin - tabs标签切换实现代码
Dec 11 Javascript
原生js实现半透明遮罩层效果具体代码
Jun 06 Javascript
onmouseover和onmouseout的一些问题思考
Aug 14 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
May 27 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
用vue和node写的简易购物车实现
Apr 25 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
原生js实现下拉框选择组件
Jan 20 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程序--记数器
2006/10/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
php定时执行任务设置详解
2015/02/06 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
javascript新手语法小结
2008/06/15 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
微信小程序签到功能
2018/10/31 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
Python requests模块实例用法
2019/02/11 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
高校学生干部的自我评价分享
2013/11/04 职场文书
班组长安全职责
2014/01/05 职场文书
歌唱比赛主持词
2014/03/18 职场文书
新手上路标语
2014/06/20 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
委托书怎样写
2014/08/30 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
2015年个人招商工作总结
2015/04/25 职场文书