我看到了下图,它看起来相当混乱。
所以我的问题来了:
为什么JavaScipt有单独的Function和Object函数对象(而不是简单地在顶层定义所有内容由用户指向单个原型对象Root,并使用原型根指向根,这似乎要简单得多以及更直观的设计)?
谢谢。
抱歉我的误解。现在我意识到:
-
JavaScript有原始数据类型和对象。基元数据类型为boolean、number、string、null和undefined。需要时这些被视为布尔值、数字和字符串的实例。每件事else是一个对象,包括函数、数组、正则表达式和日期。函数可以用作构造函数,也可以用作普通函数。当函数用作构造函数时,它可以用于实例化对象实例。实例化的原型实例(通过
__proto__
属性访问)设置为构造函数的"prototype"属性。__proto__
成员用于通过原型继承链解析属性。由于函数比对象更专业,因此有一个Function.prototype对象卡在函数和之间的原型继承链中顶级Object.prototype对象。函数和对象构造函数函数本身通常不应该是必需的,因为我们可以直接使用函数关键字和对象文字。
构造函数只能有一个原型(在任何给定时间)。当一个对象被构造时,它就与它的构造函数引用的原型对象相关。函数对象(以及字符串对象和日期对象等)具有具有不同属性集的原型。所有对象都有原型链,这些原型链最终返回到对象原型。
Function实例的情况更为明显:构造的对象是函数。Function构造函数(它是本机运行时的一部分)为构造的对象提供内部属性,使运行时可以访问与函数相关的代码块。具体而言(这都来自规范第13.2节:
[[Call]]
内部属性设置为解析的函数体(函数的代码)的值[[Construct]]
内部属性也设置为函数体(这就是为什么所有函数都可以用作构造函数)[[HasInstance]]
内部属性是指实现第15.3.5.3节的内部代码,该节使instanceOf
工作
并且类似地用于内部属性[[Code]]
、[[FormalParameters]]
、[[Scope]]
等。换句话说,函数对象在很多方面都是迭代特殊的。然而,在它与Function原型的关系中,它并不是特别的。在函数对象本身的属性查找过程中,会咨询函数原型。例如,当解析这样的表达式时:
var bound = function() { alert(this); }.bind("hello");
运行库必须找到属性"bind"。它不会在函数对象本身上找到,但会在原型上找到。