关于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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
js 操作select相关方法函数
Dec 06 Javascript
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
JavaScript获取URL中参数querystring的方法详解
Oct 11 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 Javascript
详解Vue2.x-directive的学习笔记
Jul 17 Javascript
Vue AST源码解析第一篇
Jul 19 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
vue自定义组件实现双向绑定
Jan 13 Vue.js
原生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实现图片压缩的两则实例
2014/07/19 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
jquery中获取元素的几种方式小结
2011/07/05 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
Python中的进程分支fork和exec详解
2015/04/11 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
会计自我鉴定
2013/11/02 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
2015大学生实训报告
2014/11/05 职场文书
会计师事务所实习证明
2014/11/16 职场文书
事业单位年度考核评语
2014/12/31 职场文书
工作时间证明
2015/06/15 职场文书