javascript - `Object` 是 JavaScript 中的函数吗?

标签 javascript prototype

考虑这个函数:

function Foo(){
    var a = "3";
};

根据 __proto__ VS. prototype in JavaScript ,

Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype

我理解那部分内容,但如果我在 Google Chrome 控制台中执行此操作:

Object.__proto__
output: ƒ () { /* native code */ }

Function.__proto__
output: ƒ () { /* native code */ }

Q1:为什么他们指向 Function? FunctionObject 究竟是什么?它们之间有何不同,因为 Object 实际上是一个函数? :

typeof Object
"function"

Q2:如果在 JavaScript 中一切都是对象,那么为什么 Object 是一个函数?另外,函数实际上是如何在 JavaScript 中实现的?函数内声明的变量会发生什么?函数是否被 JavaScript 编译器转换为对象?

抱歉,如果我遗漏了一些明显的东西。我对 JavaScript 中函数和对象的实现方式感到非常困惑。

最佳答案

您似乎混淆了“对象”(数据结构)和 Object(函数)。

对象是 JavaScript 中的一个概念,它是一些数据的通用容器。对象包含具有键和关联值的属性。

在 JavaScript 中,所有不是 primitive 的东西是一个对象。这包括函数,它们基本上是一种特殊类型的对象,可以使用 () 语法“调用”。

JavaScript 提供了许多具有不同用途的内置函数。两个这样的函数恰好被称为 ObjectFunction。所以换句话说,Object 是一个函数,因此也是一个“对象”(数据结构)。

让我们以您的函数 Foo 为例:

function Foo() {
    var a = "3";
}

Foo 是一个函数。这意味着可以调用 Foo,例如。 var f = Foo()。在这种情况下,f 将是 undefined,因为 Foo 不返回任何内容。

因为Foo 是一个函数,它也是一个对象。这意味着我们还可以从中添加和读取属性:

Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6

请注意,Foo 的这个“对象”部分与函数的内容无关。这意味着您声明的代码 (var a = "3") 是无关紧要的。您不能在这里以任何方式访问 var a,因为它在您调用该函数之前不存在。如果您要执行 Foo.a,您不是在函数内部操作 var a;您正在使用对象 Foo 上的属性 a

但是你可以反过来做,在函数内部访问 Foo 的属性:

function Foo() {
    var a = "3"; // a is local to this scope, you cannot get to it from outside
    console.log(a); // prints 3 - local variable a is accessible inside the scope of this function
    console.log(Foo.a); // prints 5 - a is a property on object Foo, and is accessible here
}
// var a inside Foo cannot be accessed here
Foo.a = 5;
Foo();

编辑:回复。你在评论中关于“这个”的问题。 this 是 JavaScript 中引用对象的特殊关键字。但是,这个对象不是函数本身,它是一个新对象,当您使用new 关键字调用函数时创建:

function Bar() {
    this.a = 10;
    console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10

new 关键字调用的函数称为“构造函数”。 ObjectFunction 都是构造函数的示例,这就是为什么它们的名称以大写字母开头(JavaScript 中的约定)。

当您使用构造函数创建对象时,此函数的属性prototype 用作创建对象的原型(prototype)(可通过__proto__ 访问)。

console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true

this 也用于其他事情,但这是一个广泛的主题,超出了这个问题的范围。

关于javascript - `Object` 是 JavaScript 中的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54861385/

相关文章:

javascript - 继承nodejs

javascript - 在 Javascript 中,执行深层复制时,由于属性为 "this",如何避免循环?

javascript - React 组件中的不同区域

javascript - 您将如何在 typescript 中定义一个既是对象又是函数的类型?

javascript - 如何在 NodeJS MVC 中使用原型(prototype) - 尝试使用原型(prototype)函数添加模型变量的默认值

javascript - 不处理文档和元素原型(prototype)的一般原因

javascript - 使用 Chrome 在 Javascript 中获取对象的真实位置

javascript - WebRTC:强制对等方使用 TURN 服务器

javascript - 谷歌地图 v3 出现扭曲并加倍

javascript - 将工具提示添加到数据表的特定列