关于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数组处理多个字符串的连接问题
Aug 20 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
Jan 06 Javascript
jQuery中index()方法用法实例
Dec 27 Javascript
jQuery实现复选框成对选择及对应取消的方法
Mar 03 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
DropDownList实现可输入可选择(两种版本可选)
Dec 07 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
vue实现购物车的小练习
Dec 21 Vue.js
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函数(ignore_user_abort)
2012/08/01 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[01:13]这,就是刀塔
2014/07/16 DOTA
python 网络编程常用代码段
2016/08/28 Python
用python发送微信消息
2020/12/21 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
大学生就业策划书范文
2014/04/04 职场文书
党员演讲稿
2014/09/04 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
拾金不昧表扬信
2015/01/16 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
大学生军训感言
2015/08/01 职场文书
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers