设计:为什么JavaScript有独立的函数和对象对象,为什么它们有自己独立的原型对象?

设计:为什么JavaScript有独立的函数和对象对象,为什么它们有自己独立的原型对象?,javascript,prototype,prototypal-inheritance,prototype-programming,Javascript,Prototype,Prototypal Inheritance,Prototype Programming,我遇到了一条看起来很乱的路 所以我的问题来了: 为什么JavaScipt有单独的函数和对象函数对象 (而不是简单地在顶层定义所有内容。) 由用户指向单个原型对象根,并与原型一起 根指向根,这似乎更简单 还有更直观的设计 谢谢 对不起,我误会了。现在我意识到: JavaScript具有基本数据类型和对象。基本数据类型是 布尔值、数字、字符串、null和未定义。需要的时候,前三个 它们被视为布尔、数字和字符串的实例。一切 else是一个对象,包括函数、数组、正则表达式和 日期。函数可以用作构造函

我遇到了一条看起来很乱的路

所以我的问题来了:

为什么JavaScipt有单独的函数和对象函数对象 (而不是简单地在顶层定义所有内容。) 由用户指向单个原型对象根,并与原型一起 根指向根,这似乎更简单 还有更直观的设计

谢谢


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

  • JavaScript具有基本数据类型和对象。基本数据类型是 布尔值、数字、字符串、null和未定义。需要的时候,前三个 它们被视为布尔、数字和字符串的实例。一切 else是一个对象,包括函数、数组、正则表达式和 日期。函数可以用作构造函数或普通函数。 当函数用作构造函数时,它可以用来实例化 通过新操作符创建对象实例。实例化对象的原型 实例(通过
    \uuu proto\uu
    属性访问)设置为构造函数的 实例化实例时的“prototype”属性。
    \uuuuuuuuuuuuuu
    成员用于通过原型继承链解析属性

    因为函数比对象更专业化,所以有一个Function.prototype 对象卡在函数和 顶级对象。原型对象。函数和对象构造函数 功能本身通常不需要,因为我们可以 直接使用函数关键字和对象文字


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

函数实例的情况更为明显:构造的对象是函数。函数构造函数(本机运行时的一部分)提供构造的对象内部属性,使运行时能够访问与函数关联的代码块。具体而言(这都来自:

  • [[Call]]
    内部属性设置为已解析函数体的值(函数的代码)
  • [[Construct]]
    内部属性也设置为函数体(这就是为什么所有函数都可以用作构造函数)
  • [[HasInstance]]
    内部属性用于引用实现的内部代码,从而使
    instanceOf
    工作
同样,对于内部属性
[[code]]
[[FormalParameters]]
[[Scope]]
,以及其他。换句话说,函数对象在很多方面都非常特殊。但是,就其与函数原型的关系而言,它并不是真正特殊的。在函数对象本身的属性查找过程中,会参考函数原型。例如,在解析类似以下表达式时:

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

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

因为函数实例不同于对象实例。它们是函数。但我的理解是,在JavaScript中,所有内容都是对象和函数。请参阅以下帖子:@JohnSonderson恐怕你的理解不正确。不是JavaScript中的所有东西都是对象,当然也不是所有东西都是函数。@JohnSonderson:不是。每个函数都是对象,但不是所有东西都是对象,也不是每个对象都是函数。@JohnSonderson:你的理解是错误的。虽然所有东西都是对象,函数都是对象,但不是所有东西都是函数。@JohnSonderson是的,这是真的-任何函数都可以是构造函数。我的观点是,一个对象只有一个构造函数,而该函数对象的“prototype”属性的值决定了新对象的原型链。@JohnSonderson(还有
object.create()
,但仍然是这样,一个对象只与原型对象相关一次)。小心!!虽然说“所有由函数构造函数创建的本机ECMAScript函数都是构造函数”是正确的,它不适用于所有javascript函数,甚至不适用于所有ECMAScript函数。许多内置方法都是函数而不是构造函数(例如Array.prototype.slice),几乎所有宿主方法都是函数而不是构造函数(例如document.getElementById()).@RobG yes抱歉,这当然是真的。@Johnson Derson我要重新编辑,因为您的更改改变了我的意思。我不是在函数原型上谈论属性(可见属性)。我是在谈论内部(不可见)用于使函数实例作为函数工作的属性。该过程不涉及函数原型。