设计:为什么JavaScript有单独的Function和Object对象,以及为什么它们有自己单独的原型对象



我看到了下图,它看起来相当混乱。

所以我的问题来了:

为什么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"。它不会在函数对象本身上找到,但会在原型上找到

相关内容

最新更新