关于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 类定义的4种方法
Sep 12 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
Oct 29 Javascript
Google 地图控件集详解及实例代码
Aug 06 Javascript
Angularjs 设置全局变量的方法总结
Oct 20 Javascript
微信小程序 scroll-view组件实现列表页实例代码
Dec 14 Javascript
javascript中join方法实例讲解
Feb 21 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
Apr 04 jQuery
JavaScript React如何修改默认端口号方法详解
Jul 28 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 Javascript
解决await在forEach中不起作用的问题
Feb 25 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 全角转半角实现代码
2010/05/16 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
PHP分页类集锦
2014/11/18 PHP
PHP加密解密类实例分析
2015/04/20 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
Python 专题四 文件基础知识
2017/03/20 Python
Python创建xml文件示例
2017/03/22 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python决策树分类算法学习
2017/12/22 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
python matplotlib库的基本使用
2020/09/23 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
介绍一下gcc特性
2012/01/20 面试题
办公室助理岗位职责
2013/12/25 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
2014年维稳工作总结
2014/11/18 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
普通员工辞职信范文
2015/05/12 职场文书
2016十一国庆节感言
2015/12/09 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书