javascript - `Object` 是 JavaScript 中的函数吗?
问题描述
考虑这个函数:
function Foo(){
var a = "3";
};
根据__proto__ VS。JavaScript 中的原型,
Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
我理解那部分,但如果我在 Google Chrome 控制台中执行此操作:
Object.__proto__
output: ƒ () { /* native code */ }
Function.__proto__
output: ƒ () { /* native code */ }
Q1:他们为什么指向函数?它们实际上是什么Function
以及Object
它们之间有何不同,因为它们Object
实际上是一个函数?:
typeof Object
"function"
Q2:如果 JavaScript 中的一切都是对象,那为什么是Object
函数呢?另外,函数是如何在 JavaScript 中实际实现的?函数内部声明的变量会发生什么?JavaScript 编译器是否将函数转换为对象?
抱歉,如果我遗漏了一些明显的东西。我对在 JavaScript 中实现函数和对象的方式感到非常困惑。
解决方案
您似乎对“对象”(数据结构)和Object
(函数)感到困惑。
对象是 JavaScript 中的一个概念,它是一些数据的通用容器。对象包含带有键和关联值的属性。
在 JavaScript 中,所有不是原始的东西都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以用()
语法“调用”。
JavaScript 提供了许多具有不同用途的内置函数。碰巧调用了两个这样的函数Object
和Function
。换句话说,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
;您正在使用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();
编辑:回复。您在评论中关于“这个”的问题。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
关键字调用的函数称为“构造函数”。Object
并且Function
都是构造函数的示例,这就是为什么它们的名称以大写字母开头(JavaScript 中的约定)。
当您使用构造函数创建对象时,prototype
此函数的属性用作__proto__
创建对象的原型(可通过 访问)。
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true
this
也用于其他事情,但这是一个广泛的主题,超出了这个问题的范围。
推荐阅读
- powershell - 无法从 url powershell 获得响应
- airflow - 气流调度程序不会排队一些已在 UI 中清除的任务
- android - 如何阻止片段一直弹出到根片段?[导航组件]
- python - 在python中应用R的函数
- sql - SSRS CASE 基于参数选择然后传递 Select 语句
- typescript - 声明符合类型的函数
- python - Python:如果在函数中声明了一个变量,我可以在下次调用该函数时访问它的值吗?
- intellij-idea - Selenide IntelliJ IDEA - 将当前剪贴板中的文本插入登录表单而不是 @
- sql - 复制 Crystal Reports 查询,它在 SQL Studio 中不返回任何数据
- javascript - 为什么我的图像没有按预期更新?