我遇到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构造函数 因为我们可以做,所以通常不需要函数 直接使用函数关键字和对象文字。
答案 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"。它不会在函数对象本身找到,但将在原型上找到。