`Object`是JavaScript中的一个函数吗?

vik*_*ant 54 javascript prototype

考虑这个功能:

function Foo(){
    var a = "3";
};
Run Code Online (Sandbox Code Playgroud)

根据__proto__ VS. JavaScript中的原型,

Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
Run Code Online (Sandbox Code Playgroud)

我理解了这一部分,但如果我在Google Chrome控制台中执行此操作:

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

Function.__proto__
output: ƒ () { /* native code */ }
Run Code Online (Sandbox Code Playgroud)

Q1:他们为什么指向功能?它们实际上是什么Function以及Object它们如何彼此不同,因为Object实际上是一个函数?:

typeof Object
"function"
Run Code Online (Sandbox Code Playgroud)

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

对不起,如果我错过了一些明显的事 我真的很困惑函数和对象在JavaScript中的实现方式.

Tii*_*iJ7 66

您似乎在"对象"(数据结构)和Object(函数)之间感到困惑.

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

在JavaScript中,所有非基元的东西都是对象.这包括函数,它们基本上是一种可以用()语法"调用"的特殊类型的对象.

JavaScript提供了许多具有各种用途的内置函数.两个这样的功能,碰巧被称为ObjectFunction.因此换句话说,它Object是一个函数,因此也是一个"对象"(数据结构).

我们以您的函数Foo为例:

function Foo() {
    var a = "3";
}
Run Code Online (Sandbox Code Playgroud)

Foo是一个功能.这意味着Foo可以调用,例如.var f = Foo().在这种情况下fundefined因为Foo不返回任何东西.

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

Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
Run Code Online (Sandbox Code Playgroud)

请注意,此"对象"部分Foo与功能的内容无关.这意味着你声明的代码(var a = "3")是无关紧要的.您无法var a以任何方式访问此处,因为在您调用该函数之前它不存在.如果你这样做Foo.a,你就不会var a在函数内部操纵; 您正在使用a该对象上的属性Foo.

但是,你可以反过来这样做并访问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();
Run Code Online (Sandbox Code Playgroud)

编辑:重新.您在评论中关于"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
Run Code Online (Sandbox Code Playgroud)

new关键字调用的函数称为"构造函数".Object并且Function都是构造函数的示例,这就是为什么它们的名称以大写字母开头(JavaScript中的约定).

使用构造函数创建对象时prototype,此函数的属性将用作__proto__创建对象的原型(可通过).

console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
Run Code Online (Sandbox Code Playgroud)

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

  • @vikrant`prototype`只是函数`Function`的一个属性。显然,它被定义为一个函数本身。对象可以在其属性中具有函数,并且由于“函数”是一个函数(因此是一个对象),因此它也可以起作用。我不知道他们为什么决定使Function.prototype也成为一个函数,但这并不重要,因为一个函数可以做一个对象可以做的任何事情。 (2认同)

Nab*_*hid 15

Function和Object都是构造函数,它们可以分别用于创建函数和对象,这就是typeof Function返回的原因function.

关于对象和函数之间的异同,请考虑以下几点:

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

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

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

我希望它能清除这两个问题.


zma*_*mag 11

Q1:他们为什么指向功能?

A1:因为它们是功能.Function并且Object只是构造函数.

功能是一个Function object.对象是一个Object object.

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

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

typeof Object
// 'function'
typeof new Object()
// 'object'
Run Code Online (Sandbox Code Playgroud)

函数是一个实例Function,因此使函数成为一个对象.

(function(){}) instanceof Function
// true
Run Code Online (Sandbox Code Playgroud)


ami*_*309 8

从根本上

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

对于Pointx和的班级y.

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

答案1

在此,pobject包含数据或其它功能.

p.isOrigin 是功能.

类似地,类Point本身是一个function其中当运行产生p.这就是为什么所有的类都ObjectFunctionsfunctions更精确constructor functions.

答案2

如果一切都是JavaScript中的对象,那么为什么是Object函数?

与答案1相同.

另外,如何在JavaScript中实际实现一个函数?

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

在函数内声明的变量会发生什么?

无关.每次function运行的范围都包含该功能的所有数据.

函数是否由JavaScript编译器转换为对象?

不知道你在问什么.


Ano*_*noE 6

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

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

在对象上定义方法仅表示存在具有该名称的属性,并且该属性引用了一个对象,该对象恰好是“功能对象”。

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

如您所知,JavaScript中没有类,它是一种基于原型的面向对象的语言(就您所知,它是面向对象的,从字面上看,它什么也没有)。因此,任何一种“原型”都只是对象之间的链接。构造函数方法(如上面给出的链接解释)只是简单地调用与它被调用对象的构造方法(即类似String)作为参数,就像语言会打电话Callthis作为对象的方法被调用上。


FZs*_*FZs 5

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()
Run Code Online (Sandbox Code Playgroud)

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

因此,尽管不是所有的东西都是一个函数,但是大多数大写的本机标识符都引用一个构造函数。