关于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 相关文章推荐
飞鱼(shqlsl) javascript作品集
Dec 16 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
May 22 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
js实现手机拍照上传功能
Jan 17 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
javascript中BOM基础知识总结
Feb 14 Javascript
Vue异步组件使用详解
Apr 08 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
Aug 25 Javascript
原生JS无缝滑动轮播图
Oct 22 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
php的socket编程详解
2016/11/20 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
js实现简单的验证码
2015/12/25 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
Python金融数据可视化汇总
2017/11/17 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
django将数组传递给前台模板的方法
2019/08/06 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
中间件分为哪几类
2016/09/18 面试题
初中校园广播稿
2014/02/02 职场文书
安踏广告词改编版
2014/03/21 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
网络营销计划
2015/01/17 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
一条 SQL 语句执行过程
2022/03/17 MySQL