【问题标题】:Design: why does JavaScript have separate Function and Object objects, and why do these have their own separate prototype objects? [closed]设计:为什么 JavaScript 有独立的 Function 和 Object 对象,为什么它们有自己独立的原型对象? [关闭]
【发布时间】:2014-10-26 23:28:32
【问题描述】:

我遇到过following diagram,它看起来很乱。

所以我的问题来了:

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

谢谢。


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

  • JavaScript 具有原始数据类型和对象。原始数据类型是 布尔值、数字、字符串、null 和未定义。当需要前三个 这些被视为布尔值、数字和字符串的实例。一切 else 是一个对象,包括函数、数组、正则表达式和 日期。函数可以用作构造函数或普通函数。 当函数用作构造函数时,它可以用于实例化 通过 new 运算符的对象实例。实例化的原型 实例(通过__proto__ 属性访问)设置为构造函数的 实例化时的“原型”属性。 __proto__ 成员用于通过原型继承链解析属性。

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

【问题讨论】:

  • 因为 Function 实例不同于 Object 实例。它们是函数。
  • 但我的理解是,在 JavaScript 中,一切都是对象和函数。看到这个帖子:markdalgleish.com/2012/10/…
  • @JohnSonderson 恐怕您的理解不正确。并非 JavaScript 中的所有内容都是对象,当然也不是所有内容都是函数。
  • @JohnSonderson:不。每个函数都是对象,但并非所有对象都是对象,也不是每个对象都是函数。
  • @JohnSonderson:你的理解是错误的。虽然一切都是对象,函数也是对象,但并非一切都是函数。

标签: javascript prototype prototypal-inheritance prototype-programming


【解决方案1】:

构造函数只能有一个原型(在任何给定时间)。当一个对象被构造时,它就与它的构造函数所引用的原型对象相关联。函数对象(以及字符串对象和日期对象等)具有具有不同属性集的原型。所有对象都有原型链,最终会回到 Object 原型。

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

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

对于内部属性[[Code]][[FormalParameters]][[Scope]] 等也是如此。换句话说,函数对象在很多方面都是内部特殊的。然而,就其与 Function 原型的关系而言,它并没有什么特别之处。在对函数对象本身进行属性查找的过程中会参考函数原型。例如,当解析这样的表达式时:

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

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

【讨论】:

  • @JohnSonderson 是的,这是真的——任何函数都可以是构造函数。我的观点是,一个对象只有一个构造函数,而该函数对象的“原型”属性的值决定了新对象的原型链。
  • @JohnSonderson(好吧,还有Object.create(),但仍然是一个对象在与原型对象相关联时只获得一次机会)。
  • 小心!!虽然说“所有由 Function 构造函数创建的 native ECMAScript 函数都是构造函数”是对的,但它并不适用于所有 javascript 函数或甚至所有的 ECMAScript 函数。许多内置方法是函数而不是构造函数(例如 Array.prototype.slice),几乎所有宿主方法都是函数而不是构造函数(例如 document.getElementById())。
  • @RobG 是的,抱歉,这当然是真的。
  • @JohnSonderson 我将重新编辑编辑,因为您的更改改变了我的意思。我不是在谈论函数原型上的属性(可见属性)。我在谈论用于使 Function 实例作为函数工作的内部(不可见)属性。该过程不涉及 Function 原型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2021-10-29
  • 2022-06-12
  • 2011-12-25
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多