`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? Function
和 Object
究竟是什么,它们之间有何不同,因为 Object
实际上是一个函数 ?:
typeof Object
"function"
Q2:如果在JavaScript中一切都是对象,那么为什么Object
是一个函数?另外,JavaScript 中的函数实际上是如何实现的?函数内声明的变量会发生什么? JavaScript 编译器是否将函数转换为对象?
抱歉,如果我遗漏了一些明显的东西。我真的对 JavaScript.
中函数和对象的实现方式感到困惑
Q1:为什么指向Function?
A1:因为它们是函数。 Function
和 Object
只是构造函数。
函数是一个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
具有 x
和 y
。
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
答案 1
在此,p
为object
,包含数据或其他功能。
p.isOrigin
是函数。
类似地,class Point
本身就是一个 function
,当 运行 时会产生 p
。这就是为什么所有 class 像 Object
和 Functions
是 functions
更准确地说 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中函数和对象的关系,考虑以下几点:
- 所有非基本类型都是 JavaScript 中的对象。
- 所有对象直接或间接继承自 Object.prototype(除非使用 setPrototypeOf 显式更改原型)。
- 所有原生函数都继承自 Function.prototype,而 Function.prototype 继承自 Object.prototype,因此这意味着函数间接继承自 Object.prototype,因为函数在 JavaScript 中被视为对象。
- 函数被视为对象的原因是因为它们可以作为参数传递给其他函数,并且可以从函数返回,即高阶函数(javascript 的强大功能)。
可以使用 ()
运算符调用函数,因为 JavaScript 引擎知道它是使用函数关键字声明的并且具有可执行代码。因此,无论何时调用它,JavaScript 引擎都会创建一个新的执行上下文并设置 this
绑定,然后执行该函数。 None 当您尝试调用对象而不是抛出错误时会发生这种情况,即 "is not a function".
所以我们可以说并不是每个对象都是函数,因为它们可能没有使用 function 关键字声明并且没有可执行代码。
- 由于函数在 JavaScript 中被视为一个对象,我们可以为其添加属性,从中创建新对象。
- 无法使用
()
调用非函数类型对象,因为它没有可执行代码,也没有使用function 关键字声明。相反,它使用 new Object()
或对象表示法声明并包含方法和属性。
我希望它能解决这两个问题。
您似乎混淆了 "object"(数据结构)和 Object
(函数)。
对象是 JavaScript 中的一个概念,它是某些数据的通用容器。对象包含具有键和关联值的属性。
在JavaScript中,所有不是primitive的都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以是 "called" 和 ()
语法。
JavaScript 提供了许多具有不同用途的内置函数。两个这样的函数恰好被称为 Object
和 Function
。所以换句话说 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"。 Object
和 Function
都是构造函数的例子,这就是为什么它们的名字以大写字母开头(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 参考非常适合回答此类问题。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-ecmascript-language-types 是关于语言支持哪些类型的入口点,它引入了这样一个概念,即所有的东西要么是一个相当标准的值(布尔值、字符串等),要么是一个对象。但没有更多类型。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-type 解释对象类型。本质上,它是属性 and/or 访问器的集合(想想 getter/setter)。这也引入了术语"function object"。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-internal-methods-and-internal-slots显示了对象的内部语义、内部方法等。在该部分的末尾,具体描述了 "function object" 特定的内部结构("Call" 和 "Construct"),包括一些细节,例如构造函数是可选的。
因此,回答你的问题:Foo
只能是一个对象(因为菜单上的其他所有内容都是基本值类型)。因此,Foo()
是一种特殊语法,它只调用该对象的内部 Call
方法。但是 Foo
本身就是一个彻头彻尾的对象,你可以用它做任何你能对任何其他对象做的事情,包括在它上面设置任意属性。
在一个对象上定义一个方法仅仅意味着有一个具有该名称的属性,并且该属性引用一个对象,恰好是一个 "function object".
同样,可以用作构造函数的只是一个恰好具有 Construct
内部方法和调用它的语法糖的对象。
如你所知,JavaScript中没有类,它是一种基于原型的面向对象语言(它像面向对象一样你可以得到,它实际上没有别的)。所以任何一种 "prototype" 都只是对象之间的 link 。构造函数方法(如上面给出的 link 中所述)只是简单地调用构造函数方法,并将调用它的对象(即类似 String
的对象)作为参数,就像语言调用一样Call
其中 this
是调用该方法的对象。
考虑这个函数:
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? Function
和 Object
究竟是什么,它们之间有何不同,因为 Object
实际上是一个函数 ?:
typeof Object
"function"
Q2:如果在JavaScript中一切都是对象,那么为什么Object
是一个函数?另外,JavaScript 中的函数实际上是如何实现的?函数内声明的变量会发生什么? JavaScript 编译器是否将函数转换为对象?
抱歉,如果我遗漏了一些明显的东西。我真的对 JavaScript.
中函数和对象的实现方式感到困惑Q1:为什么指向Function?
A1:因为它们是函数。 Function
和 Object
只是构造函数。
函数是一个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
具有 x
和 y
。
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
isOrigin() { return x == 0 && y == 0; }
}
let p = new Point();
答案 1
在此,p
为object
,包含数据或其他功能。
p.isOrigin
是函数。
类似地,class Point
本身就是一个 function
,当 运行 时会产生 p
。这就是为什么所有 class 像 Object
和 Functions
是 functions
更准确地说 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中函数和对象的关系,考虑以下几点:
- 所有非基本类型都是 JavaScript 中的对象。
- 所有对象直接或间接继承自 Object.prototype(除非使用 setPrototypeOf 显式更改原型)。
- 所有原生函数都继承自 Function.prototype,而 Function.prototype 继承自 Object.prototype,因此这意味着函数间接继承自 Object.prototype,因为函数在 JavaScript 中被视为对象。
- 函数被视为对象的原因是因为它们可以作为参数传递给其他函数,并且可以从函数返回,即高阶函数(javascript 的强大功能)。
可以使用
()
运算符调用函数,因为 JavaScript 引擎知道它是使用函数关键字声明的并且具有可执行代码。因此,无论何时调用它,JavaScript 引擎都会创建一个新的执行上下文并设置this
绑定,然后执行该函数。 None 当您尝试调用对象而不是抛出错误时会发生这种情况,即 "is not a function".所以我们可以说并不是每个对象都是函数,因为它们可能没有使用 function 关键字声明并且没有可执行代码。
- 由于函数在 JavaScript 中被视为一个对象,我们可以为其添加属性,从中创建新对象。
- 无法使用
()
调用非函数类型对象,因为它没有可执行代码,也没有使用function 关键字声明。相反,它使用new Object()
或对象表示法声明并包含方法和属性。
我希望它能解决这两个问题。
您似乎混淆了 "object"(数据结构)和 Object
(函数)。
对象是 JavaScript 中的一个概念,它是某些数据的通用容器。对象包含具有键和关联值的属性。
在JavaScript中,所有不是primitive的都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以是 "called" 和 ()
语法。
JavaScript 提供了许多具有不同用途的内置函数。两个这样的函数恰好被称为 Object
和 Function
。所以换句话说 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"。 Object
和 Function
都是构造函数的例子,这就是为什么它们的名字以大写字母开头(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 参考非常适合回答此类问题。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-ecmascript-language-types 是关于语言支持哪些类型的入口点,它引入了这样一个概念,即所有的东西要么是一个相当标准的值(布尔值、字符串等),要么是一个对象。但没有更多类型。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-type 解释对象类型。本质上,它是属性 and/or 访问器的集合(想想 getter/setter)。这也引入了术语"function object"。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-object-internal-methods-and-internal-slots显示了对象的内部语义、内部方法等。在该部分的末尾,具体描述了 "function object" 特定的内部结构("Call" 和 "Construct"),包括一些细节,例如构造函数是可选的。
因此,回答你的问题:Foo
只能是一个对象(因为菜单上的其他所有内容都是基本值类型)。因此,Foo()
是一种特殊语法,它只调用该对象的内部 Call
方法。但是 Foo
本身就是一个彻头彻尾的对象,你可以用它做任何你能对任何其他对象做的事情,包括在它上面设置任意属性。
在一个对象上定义一个方法仅仅意味着有一个具有该名称的属性,并且该属性引用一个对象,恰好是一个 "function object".
同样,可以用作构造函数的只是一个恰好具有 Construct
内部方法和调用它的语法糖的对象。
如你所知,JavaScript中没有类,它是一种基于原型的面向对象语言(它像面向对象一样你可以得到,它实际上没有别的)。所以任何一种 "prototype" 都只是对象之间的 link 。构造函数方法(如上面给出的 link 中所述)只是简单地调用构造函数方法,并将调用它的对象(即类似 String
的对象)作为参数,就像语言调用一样Call
其中 this
是调用该方法的对象。