关于JavaScript 原型链的一点个人理解


Posted in Javascript onJuly 31, 2016

JavaScript借鉴了许多语言的特点;例如语法类Java、函数借鉴Scheme、原型继承借鉴自Self、正则表达式借鉴于Perl。(DC Javascript:语言精粹)。

     首先,每个JS是一门基于原型继承的面向对象的语言。里面数组是对象、函数是对象、“对象”当然还是对象。而且每个对象都有一个internal slot[[prototype]],这才是原型链连接起来的关键。诚然,我们可以为一个对象设置prototype property,但这又怎么样呢,这只是表象;后面暗藏杀机。

    好,那我可以用isPrototypeOf()来检验某个对象是不是另一个对象的原型;然而这也是基于[[prototype]]链的。

   举个例子:

//建立一个函数

    function foo () {} 

    //修改函数的prototype property  

    foo.prototype = {

         name : "foo.prototype" 
              };
     //建立一个实例 

      var a = new foo();

    //重写 a 的默认原型,本应该是foo.prototype.
       a.prototype = {
         name : "a.prototype"
      };

    下面的问题是foo.prototype是不是a的原型呢?!

    这要分开来看:一方面a.prototype确实是{ name : "a.prototype"};但是,foo.prototype.isPrototypeOf(a)结果是true.

    下面来看一看具体的关系:(使用--->表示不明显的[[prototype]]链,---表示prototype property关系)

        Function ---> Function.prototype--->Object.prototype

                          Function.prototype <--- foo---foo.prototype ------>Object.prototype 。

    另外,Number、Boolean、String等的[[protptype]]仍然是Fuction.prototype对象。Function.prototype对象为“function”,内部不含[[construct]]故而不可做构造函数用;实际上Function.prototype类似:function () {}。“function”类型除了[[prototype]]internal slot外,还有prototype属性。每个函数总是相伴有一个prototype对象:this.prototype = {constructor:this}(一个普通对象)。这个普通对象的[[prototype]]连接到Object.prototype.

   那构造函数建立的实例对象的[[prototype]]是Object.prototype吗?

          该实例的[[prototype]]是由构造函数的prototype property初始化的,注意不是函数的[[prototype]].所以如果是由Object这个函数构造的对象,那么就确实是.

  Object是函数,它的prototype是大名鼎鼎的Object.prototype(有点废话的意思),但是它的[[prototype]]指向Function.prototype.请看下面:

                                                          Object----->Function.prototype------>Object.prototype.

 如何改变这个[[prototype]]链呢?

     可以采用var a = Object.create(obj)的形式,或Object.setPrototypeOf(objA,objB)的形式。我想例子就不用举了,因为关系很简单;况且我只举得出一些蹩脚的例子。没有意义。

 最后一个问题,行为委托是基于[[prototype]]链吗?

      是的,也是这样。

Javascript 相关文章推荐
javascript引用赋值(地址传值)用法实例
Jan 13 Javascript
jQuery检测滚动条是否到达底部
Dec 15 Javascript
node.js入门实例helloworld详解
Dec 23 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
Jun 21 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
Oct 27 Javascript
微信小程序基于本地缓存实现点赞功能的方法
Dec 18 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
Sep 03 Javascript
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 Javascript
JS实现鼠标按下拖拽效果
Jul 23 Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 Javascript
jquery实现界面无刷新加载登陆注册
Jul 30 #Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 #Javascript
Javascript中级语法快速入手
Jul 30 #Javascript
AngularJS ng-blur 指令详解及简单实例
Jul 30 #Javascript
AngularJS ng-bind-template 指令详解
Jul 30 #Javascript
AngularJS ng-bind-html 指令详解及实例代码
Jul 30 #Javascript
AngularJS ng-bind 指令简单实现
Jul 30 #Javascript
You might like
使用无限生命期Session的方法
2006/10/09 PHP
php创建多级目录代码
2008/06/05 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
JavaScript事件列表解说
2006/12/22 Javascript
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
深入解析Python中的线程同步方法
2016/06/14 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
python实现简单的五子棋游戏
2020/09/01 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
门卫工作岗位职责
2013/12/17 职场文书
《春笋》教学反思
2014/04/15 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
不同意离婚上诉状
2015/05/23 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
导游词之珠海轮廓
2019/10/25 职场文书