`Object` 是 JavaScript 中的函数吗?

Is `Object` a function in JavaScript?

考虑这个函数:

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.

中函数和对象的实现方式感到困惑

Q1:为什么指向Function?

A1:因为它们是函数。 FunctionObject 只是构造函数。

函数是一个Function object。对象是 Object object.

Q2:如果在JavaScript中一切都是对象,那么为什么Object是一个函数?

A2:因为Object只是一个构造函数。

typeof Object
// 'function'
typeof new Object()
// 'object'

而函数是 Function 的一个实例,所以函数就是一个对象。

(function(){}) instanceof Function
// true

Object是所有对象的构造函数。所以,typeof Object==="function"

这是可视化的片段:

console.log(typeof Object)            //function (which is an object)
var object=new Object()               //An instance of Object 'class'
console.log(typeof object)            //object
console.log(object instanceof Object) //true, because object is created by Object()

Function是所有函数(包括它自己...)的构造函数

因此,虽然并非所有东西都是函数,但大多数大写本机标识符都引用构造函数。

从根本上说

Functions有一些代码可以执行。
Object 是那些包含数据的。

对于 class Point 具有 xy

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();

答案 1

在此,pobject,包含数据或其他功能。

p.isOrigin 是函数。

类似地,class Point 本身就是一个 function,当 运行 时会产生 p。这就是为什么所有 class 像 ObjectFunctionsfunctions 更准确地说 constructor functions.

答案 2

If everything is an object in JavaScript, then why is Object a function?

与答案 1 相同。

Also, how is a function actually implemented inside JavaScript?

不同的JavaScript引擎会有不同的实现。他们有需要遵循的规范。

What happens to the variables declared inside a function?

题外话。每个 function 都在一个范围内运行,该范围包含该函数的所有数据。

Is a function converted into an object by the JavaScript compiler?

不确定你在问什么。

Function和Object都是构造函数,可以分别用来创建一个函数和一个对象,所以typeof Function returns function.

关于javascript中函数和对象的关系,考虑以下几点:

  1. 所有非基本类型都是 JavaScript 中的对象。
  2. 所有对象直接或间接继承自 Object.prototype(除非使用 setPrototypeOf 显式更改原型)。
  3. 所有原生函数都继承自 Function.prototype,而 Function.prototype 继承自 Object.prototype,因此这意味着函数间接继承自 Object.prototype,因为函数在 JavaScript 中被视为对象。
  4. 函数被视为对象的原因是因为它们可以作为参数传递给其他函数,并且可以从函数返回,即高阶函数(javascript 的强大功能)。
  5. 可以使用 () 运算符调用函数,因为 JavaScript 引擎知道它是使用函数关键字声明的并且具有可执行代码。因此,无论何时调用它,JavaScript 引擎都会创建一个新的执行上下文并设置 this 绑定,然后执行该函数。 None 当您尝试调用对象而不是抛出错误时会发生这种情况,即 "is not a function".

    所以我们可以说并不是每个对象都是函数,因为它们可能没有使用 function 关键字声明并且没有可执行代码。

  6. 由于函数在 JavaScript 中被视为一个对象,我们可以为其添加属性,从中创建新对象。
  7. 无法使用() 调用非函数类型对象,因为它没有可执行代码,也没有使用function 关键字声明。相反,它使用 new Object() 或对象表示法声明并包含方法和属性。

我希望它能解决这两个问题。

您似乎混淆了 "object"(数据结构)和 Object(函数)。

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

在JavaScript中,所有不是primitive的都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以是 "called" 和 () 语法。

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

我们以你的函数Foo为例:

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

Foo 是一个函数。这意味着可以调用 Foo,例如。 var f = Foo()。在这种情况下,f 将是 undefined,因为 Foo 没有 return 任何东西。

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

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

请注意Foo的"object"部分与函数内容无关。这意味着您声明的代码 (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" 的问题。 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 关键字调用的函数称为 "constructor function"。 ObjectFunction 都是构造函数的例子,这就是为什么它们的名字以大写字母开头(JavaScript 中的约定)。

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

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

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

是的,Object是函数类型。这是一个 class/Function 实现,当使用 new (new Object()) 调用时,将产生一个分配了内存的对象。

ECMAScript 参考非常适合回答此类问题。

因此,回答你的问题:Foo 只能是一个对象(因为菜单上的其他所有内容都是基本值类型)。因此,Foo() 是一种特殊语法,它只调用该对象的内部 Call 方法。但是 Foo 本身就是一个彻头彻尾的对象,你可以用它做任何你能对任何其他对象做的事情,包括在它上面设置任意属性。

在一个对象上定义一个方法仅仅意味着有一个具有该名称的属性,并且该属性引用一个对象,恰好是一个 "function object".

同样,可以用作构造函数的只是一个恰好具有 Construct 内部方法和调用它的语法糖的对象。

如你所知,JavaScript中没有类,它是一种基于原型的面向对象语言(它像面向对象一样你可以得到,它实际上没有别的)。所以任何一种 "prototype" 都只是对象之间的 link 。构造函数方法(如上面给出的 link 中所述)只是简单地调用构造函数方法,并将调用它的对象(即类似 String 的对象)作为参数,就像语言调用一样Call 其中 this 是调用该方法的对象。