设计:为什么JavaScript有单独的Function和Object对象,为什么这些对象有自己独立的原型对象?

时间:2014-10-26 23:28:32

标签: javascript prototype prototypal-inheritance prototype-programming

我遇到following diagram看起来相当混乱。

所以这是我的问题:

为什么JavaScipt具有单独的Function和Object函数对象 (而不是简单地将所有内容都定义在顶层 由用户指向单个原型对象Root,并与原型 Root指向Root,这似乎更简单 更直观的设计)?

感谢。


对不起我的误会。现在我意识到:

  • JavaScript具有原始数据类型和对象。原始数据类型是 boolean,number,string,null和undefined。需要的时候前三个 这些被视为Boolean,Number和String的实例。一切 else是一个对象,包括函数,数组,正则表达式和 日期。函数可以用作构造函数或普通函数。 当函数用作构造函数时,它可用于实例化 通过new运算符的对象实例。实例化的原型 实例(通过__proto__属性访问)设置为构造函数 '原型'实例化实例时的属性。 __proto__ 成员用于通过原型继承链解析属性。

    由于函数比对象更专业,因此存在Function.prototype 对象卡在函数和函数之间的原型继承链中 顶级Object.prototype对象。 Function和Object构造函数 因为我们可以做,所以通常不需要函数 直接使用函数关键字和对象文字。

1 个答案:

答案 0 :(得分:2)

构造函数只能有一个原型(在任何给定时间)。构造对象时,它与其构造函数引用的原型对象相关。函数对象(以及String对象和Date对象等)具有包含不同属性集的原型。所有对象都有原型链,最终会返回到Object原型。

Function实例的情况更加明显:构造的对象是函数。 Function构造函数(它是本机运行时的一部分)为构造对象提供内部属性,使运行时可以访问与函数关联的代码块。具体来说(全部来自section 13.2 of the spec

  • [[Call]]内部属性设置为已解析函数体的值(函数代码)
  • [[Construct]]内部属性设置为函数体(以及为什么所有函数都可以用作构造函数)
  • [[HasInstance]]内部属性用于引用实现section 15.3.5.3的内部代码,这使instanceOf正常工作

以及类似内部属性[[Code]][[FormalParameters]][[Scope]]和其他内容。换句话说,函数对象在很多方面都是 iternally 特殊的。然而,在与功能原型的关系中,它并不是特别的。在函数对象本身的属性查找过程中查询函数原型。例如,在解析这样的表达式时:

var bound = function() { alert(this); }.bind("hello");

运行时必须找到属性" bind"。它不会在函数对象本身找到,但在原型上找到。