关于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重要知识更新
Jul 08 Javascript
调用js时ie6和ie7,ff的区别
Aug 19 Javascript
JQuery 将元素显示在屏幕的中央的代码
Feb 27 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
JavaScript实现的日期控件具体代码
Nov 18 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
Vue EventBus自定义组件事件传递
Jun 25 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
微信小程序实现侧边栏分类
Oct 21 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 json_encode奇怪问题说明
2011/09/27 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
浅谈Python单向链表的实现
2015/12/24 Python
python实现发送邮件功能
2017/07/22 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python实现公司年会抽奖程序
2019/01/22 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
Python中求对数方法总结
2020/03/10 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
行政监察建议书
2014/05/19 职场文书
员工安全责任书范本
2014/07/24 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
拾金不昧感谢信
2015/01/21 职场文书
邀请函格式范文
2015/02/02 职场文书
杜甫草堂导游词
2015/02/03 职场文书
学习党章心得体会2016
2016/01/15 职场文书
Python中for后接else的语法使用
2021/05/18 Python