“Object”是JavaScript中的函数吗?
考虑这一功能:“Object”是JavaScript中的函数吗?,javascript,prototype,Javascript,Prototype,考虑这一功能: function Foo(){ var a = "3"; }; 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
function Foo(){
var a = "3";
};
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();
根据,
我理解这一部分,但如果我在谷歌Chrome控制台中这样做:
Object.__proto__
output: ƒ () { /* native code */ }
Function.__proto__
output: ƒ () { /* native code */ }
Q1:为什么它们指向函数?实际上什么是函数
和对象
以及它们之间的区别,因为对象
实际上是一个函数:
typeof Object
"function"
Q2:如果一切都是JavaScript中的对象,那么为什么object
是函数?另外,函数实际上是如何在JavaScript中实现的?函数中声明的变量会发生什么变化?JavaScript编译器是否将函数转换为对象
对不起,如果我遗漏了一些明显的东西。函数和对象在JavaScript中的实现方式让我非常困惑。Q1:为什么它们指向函数? A1:因为它们是函数<代码>函数和
对象
只是构造函数
函数是一个函数对象
。对象是对象对象
Q2:如果一切都是JavaScript中的对象,那么为什么object
是函数?
A2:因为对象
只是一个构造函数
对象的类型
//“功能”
新对象的类型()
//“对象”
函数是函数
的一个实例,因此函数就是一个对象
(function(){})函数的实例
//真的
对象
是所有对象的构造函数。因此,typeof Object==“function”
下面是一个用于可视化的片段:
console.log(对象类型)//函数(对象类型)
var object=new object()//对象“class”的实例
console.log(对象类型)//对象
console.log(object instanceof object)//true,因为object是由object()创建的。
函数
有一些可以执行的代码对象
是包含数据的对象
对于具有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
是包含数据或其他函数的对象
p.isOrigin
是一种功能
类似地,类点
本身就是一个函数
,当运行时产生p
。这就是为什么像对象
和函数
这样的所有类都是函数
更准确地说是构造函数
答案2
如果一切都是JavaScript中的对象,那么为什么object
是函数呢
与答案1相同
另外,函数实际上是如何在JavaScript中实现的
不同的JavaScript引擎将有不同的实现。他们有需要遵循的规范
函数中声明的变量会发生什么变化
离题。每个函数
都在一个范围内运行,该范围保存该函数的所有数据
JavaScript编译器是否将函数转换为对象
不确定您在问什么。函数和对象都是构造函数,可分别用于创建函数和对象,这是函数返回函数的原因
关于函数和对象在JavaScript中的关联性,请考虑以下几点:
所有非基本类型都是JavaScript中的对象
所有对象直接或间接继承自Object.prototype(除非使用setPrototypeOf显式更改prototype)
所有本机函数都继承自Function.prototype,后者继承自Object.prototype,因此这意味着函数间接继承自Object.prototype,因为函数在JavaScript中被视为对象
函数被视为对象的原因是,它们可以作为参数传递给其他函数,并且可以从函数(即高阶函数)返回(javascript的一个强大功能)
可以使用()
操作符调用函数,因为JavaScript引擎知道它是使用function关键字声明的,并且具有可执行代码。因此,每当调用它时,JavaScript引擎都会创建一个新的执行上下文,并设置this
绑定,然后执行该函数。当您尝试调用一个对象时,所有这些都不会发生,而是会抛出一个错误,即“不是函数”
因此,我们可以说并非每个对象都是函数,因为它们可能没有使用function关键字声明,也没有可执行代码
由于函数在JavaScript中被视为对象,我们可以向其添加属性,并从中创建新对象
无法使用()
调用非函数类型对象,因为它没有可执行代码,并且未使用function关键字声明。相反,它是使用newobject()
或对象表示法声明的,并包含方法和属性
我希望它能澄清这两个问题。您似乎混淆了“对象”(数据结构)和对象(函数)
对象是JavaScript中的一个概念,是某些数据的通用容器。对象包含具有键和关联值的属性
在JavaScript中,所有不是对象的东西都是对象。这包括函数,它们基本上是一种特殊类型的对象,可以用()
语法“调用”
JavaScript提供了许多具有各种用途的内置函数。两个这样的函数恰好被称为Object
和Function
。换句话说,对象是一个函数,因此也是一个“对象”(数据结构)
让我们拿你的func
function Foo() {
var a = "3";
}
Foo.bar = 5;
Foo.bar++;
console.log(Foo.bar); // prints 6
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();
function Bar() {
this.a = 10;
console.log(this == Bar); // prints false
}
var bar = new Bar();
console.log(bar.a); // prints 10
console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true