关于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 相关文章推荐
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 Javascript
javascript中日期转换成时间戳的小例子
Mar 21 Javascript
Checbox的操作含已选、未选及判断代码
Nov 07 Javascript
jquery制作LED 时钟特效
Feb 01 Javascript
JavaScript prototype属性详解
Oct 25 Javascript
详解jQuery中的事件
Dec 14 Javascript
详解Jquery Easyui的验证扩展
Jan 09 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
Vue实现点击后文字变色切换方法
Feb 11 Javascript
JavaScript 中的无穷数(Infinity)详解
Feb 13 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 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
超级简单的发送邮件程序
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
将php数组输出html表格的方法
2014/02/24 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
python递归全排列实现方法
2018/08/18 Python
六行python代码的爱心曲线详解
2019/05/17 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python谱减法语音降噪实例
2019/12/18 Python
python Shapely使用指南详解
2020/02/18 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python正则表达式如何匹配中文
2020/05/27 Python
简单了解Django项目应用创建过程
2020/07/06 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
浅析Python requests 模块
2020/10/09 Python
管理学专业个人求职信范文
2013/12/13 职场文书
服务承诺书范文
2014/05/19 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
Mysql Show Profile
2021/04/05 MySQL