关于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 相关文章推荐
JS之小练习代码
Oct 12 Javascript
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
jQuery技巧总结
Jan 01 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 Javascript
JS刷新当前页面的几种方法总结
Dec 24 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
Jul 27 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
vue如何将v-for中的表格导出来
May 07 Javascript
JavaScript数组排序功能简单实现
May 14 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
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
javascript 继承实现方法
2009/08/26 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python检查指定文件是否存在的方法
2015/07/06 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
详解Python中的动态属性和特性
2018/04/07 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
在职党员进社区活动总结
2014/07/05 职场文书
管辖权异议上诉状
2015/05/23 职场文书
mysql sql常用语句大全
2022/06/21 MySQL