`

Function 和Object 的关系<三>

    博客分类:
  • js
 
阅读更多

http://www.cnblogs.com/tarol/p/4660866.html

 

ECMAScript规定了两个特殊的内置对象:Object和Function。他们的特殊性在于,他们本身既是对象又是函数,而他们同时也是对象和函数的构造器。这种自己生自己的逻辑显然违反人性,如果还停留在类的继承的思想上,那么更加无法理解。

  然而ECMAScript是基于原型链的,所以忘掉类的继承,从原型链入手:原型链是对象的集合,每个对象都有内部属性[[Prototype]](注1)指向另一个对象;当访问对象某一属性的时候,如果此属性不为此对象的自身属性(注2),则继续去[[Prototype]]指向的对象上查找此属性。[[Prototype]]形成的对象的链式集合即原型链。这里可以得出:原型链上的所有元素都是对象。

  ECMASciprt规定:原型链必须是有限长度(注3),而且终点必须是null。现在终点是唯一的,那么原型链上倒数第二个元素是不是唯一的呢?ECMAScript没有规定,但从实现上来看,是唯一的。因为原型链上所有的元素都是对象,所以倒数第二个元素应该是所有对象的基础对象。这个对象在实现中只给出一个引用,就是Object.prototype。这里可以得出:原型链上有两个元素是固定的,终点是null,倒数第二的元素是Object.prototype指向的对象(注4)。

  那么倒数第三个元素是不是固定的呢?不是。从倒数第二个元素是Object.prototype来看,通过{}字面量和new Object()创建的对象都在倒数第三这个位置,即POJO都在倒数第三。另外还有两个特例,一个是除内置函数之外的内置对象,如Math、JSON;一个是除Object之外的内置函数的prototype属性指向的对象,如Function.prototype。这里可以得出:原型链上倒数第三的元素一般是POJO+Math/JSON+(Function/Array/String/Boolean/Number/Date/RegExp/Error).prototype。

  倒数第三的位置出现了这么多的prototype,那么倒数第四的位置就好推测了,所有除Object之外的内置函数作为构造器调用(注5)时生成的实例对象都在倒数第四。其中需要注意的是,所有的内置函数本身是Function作为构造器调用生成的实例对象,所以都在这个位置。这里可以得出:原型链上倒数第四的元素一般是(Function/Array/String/Boolean/Number/Date/RegExp/Error)实例,其中包括(Object/Function/Array/String/Boolean/Number/Date/RegExp/Error),注意这个括号里面Object回来了。

  原型链基本结构如下图:

从图上看来:

  1. array等非POJO对象在原型链上和他们的构造器属于同一级别
  2. POJO在原型链上比他的构造器还靠后一个级别

参考文档:ES5

注:

  1. 内部属性是不开放给JS访问的属性,但现代浏览器已经可以通过__proto__属性访问和设置[[Prototype]]
  2. own property,即直接设置在此对象上的属性
  3. 执行以下代码感受下:
var a = {};
a.__proto__ = a;

      4.Object.prototype和基础对象的关系好比快捷方式和应用程序,本身没有任何关系,现在可以指向基础对象,以后也可以指向其他对象。当然原则上是不允许的,基础对象没有引用内存会被回收,所以ECMAScript规定Object下的prototype属性的writable和configuration特性都是false(特性的问题以后另起一篇)

      5.假设func为一个函数,func()即作为函数调用(调用内部函数属性[[Call]]),new func()即作为构造器调用(调用内部函数属性[[Construct]])

 

 

http://www.cnblogs.com/tarol/p/4671321.html

  • 大小: 37.3 KB
分享到:
评论

相关推荐

    ASP+ACCESS毕业设计 网上购物系统 论文+源码

    文中着重论述了该系统的功能与实现、数据流程与存储、网上购物、后台管理等&lt;br&gt;经分析,使用Microsoft公司的ASP(Active Server Pages)和相关网页开发工具,利用微软提供的IIS建立运行环境,再利用ODBC(数据源)...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    #PCDATA, element-name 包含文本和其它子元素 &lt;MYFILE(#PCDTATA,TITLE)&gt; MYFILE元素必须包含文本和TITLE子元素 , 使用逗号分隔排序 &lt;MYFILE (TITLE,AUTHOR,EMAIL)&gt; MYFILE元素必须依次包含TITILE,AUTHOR,EMAIL三...

    freemarker总结

    &lt;#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x&gt; ${x_index + 1}.${x}&lt;#if x_has_next&gt;,&lt;/if&gt; &lt;#if x="星期四"&gt;&lt;#break&gt;&lt;/#if&gt; &lt;/#list&gt; &lt;p&gt;We have these animals: ...

    xml入门教程/xml入门教程

    &lt;name&gt;s1&lt;/name&gt;&lt;!--这个name和teacher根元素中的name发生命名冲突--&gt; &lt;sex&gt;girl&lt;/sex&gt;&lt;!--这个sex和teacher根元素中的sex发生命名冲突--&gt; &lt;/student&gt; &lt;/teacher&gt; 2、名域的声明 (1)直接定义 xmlns:...

    LuaBind 源码 (Lua增强库)

    #include &lt;luabind/function.hpp&gt; #include &lt;luabind/class.hpp&gt; 你需要去做的第一件事是 调用 luabind::open(lua_State*), 由此注册可以在Lua创建类 的函数并初始化 LuaBind需要使用的 状态机全局结构. 如果你不...

    JavaScript中Object和Function的关系小结

    Function instanceof Object 和 Object instanceof Function 都是 true 1。我们可以认为 Object 是一个特殊的“类”,而这里的“类”即:Function 于是便可以理解为: Object = Function () {} 或 Object = new ...

    JavaScript中Function函数与Object对象的关系

    今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一个函数对象. 我们先来看最简单的...

    ASP.NET常用代码

    /// &lt;para&gt;格式后的异常信息字符串,包括异常内容和跟踪堆栈.&lt;/para&gt; /// &lt;/retvalue&gt; /// &lt;/summary&gt; public static String FormatException(Exception ex, String catchInfo) { StringBuilder strBuilder = new ...

    ASP.NET程序中常用的三十三种代码.txt

     /// &lt;para&gt;格式后的异常信息字符串,包括异常内容和跟踪堆栈.&lt;/para&gt;  /// &lt;/retvalue&gt;  /// &lt;/summary&gt;  public static String FormatException(Exception ex, String catchInfo)  {  StringBuilder ...

    浅谈Javascript中的Function与Object

    Function 函数就是对象,代表函数的对象就是函数对象。所有的函数对象是被Function这个函数对象构造出来的。...Function 与Object 关系图: 代码如下: [removed] var Foo= function(){} var f1 = n

    c#源码转java源码的-cpp.react:C++React:C++11的React式编程库

    它使能状态和事件流之间的数据依存关系的声明式定义。 根据这些定义,更改的传播会自动处理。 这是一个简单的例子: using namespace react; void AddNumbers(int a, int b) { return a + b; } // Two state ...

    验证javascript中Object和Function的关系的三段简单代码

    话说在楼猪理解和实践能力尚欠火候的时候,在这篇里曾经照搬了李战老师不少东西写在自己的博客...下面楼猪就通过自己写的几段简单代码,论证一下javascript内置Object和Function的关系。 1、Function就是Object,Object

    import-grapher:根据js入口点生成依赖关系树

    importgrapher &lt; entrypoint&gt; 选项 --no-cache ,禁用缓存机制 --out-file &lt;filename&gt; ,设置输出文件名 原料药 您还可以将Import Grapher用作Node.js API const importGrapher = require ( 'import-grapher' ) ; ...

    JavaScript基础和实例代码

    1.7.2 使用&lt;noscript&gt;和&lt;/noscript&gt;标记对给出提示信息 1.8 JavaScript的实现基础 1.8.1 ECMAScript 1.8.2 DOM 1.8.3 BOM 1.9 客户端与服务器端脚本 1.10 JavaScript与JScript、 VBScript 1.11 JavaScript与Java、...

    PHP 面向对象技术(全面讲解).txt

    达到了软件工程的三个目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收 信息、处理数据和向其它对象发送信息。面向对象一直是软件开发领域内比较热门的话题,首先, 面向对象符合人类看待事物的...

    [原创]自己工作中常用的模板库,简化你的工作

    [functionobject.hpp] ★ 把一些常用目的的函数封装成函数对象,比如"比较器/测试器" ☆ function object with special abstract targart. e.g. "comparer/Tester" ◆ [functionCreater.hpp] ★ 把多元函数封装为...

Global site tag (gtag.js) - Google Analytics