考虑此功能:
function Foo(){
var a = "3";
};
根据 __ proto__ vs。JavaScript中的原型,
Foo.__proto__ = Function.prototype
Function.prototype.__proto__ = Object.prototype
我理解了那部分,但是如果我在Google Chrome Console中这样做:
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
;您正在使用对象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();
编辑:re。您在评论中有关"此"的问题。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
也用于其他事物,但这是一个广泛的主题,并且不超出此问题的范围。
函数和对象都是构造函数函数,可用于创建功能和对象,这是typeof Function
返回function
的原因。
关于JavaScript中函数和对象如何相关,请考虑以下几点:
- 所有非主要类型都是JavaScript中的对象。
- 所有对象直接或间接从object.protype继承(除非使用setPrototype Fiptype更改原型)。
- 所有本机函数从function.protype继承。
- 函数被视为对象的原因是因为它们可以作为参数传递到其他功能,并且可以从函数(即高阶函数)返回(JavaScript的强大功能)。
-
可以使用
()
运算符调用函数,因为JavaScript引擎知道它是使用函数关键字声明并具有可执行代码的。因此,只要称呼它,JavaScript引擎就会创建新的执行上下文并设置this
绑定并执行该函数。当您尝试调用对象而不是抛出错误时,这些都不会发生,即"不是函数"。因此,我们可以说并非每个对象都是一个函数,因为它们可能没有使用函数关键字声明而没有可执行的代码。
- 当该函数被视为JavaScript中的对象时,我们可以向其添加属性,从中创建新对象。
- 无法使用
()
调用一个非功能类型对象,因为它没有可执行的代码,也没有使用函数关键字声明。相反,它是使用new Object()
或对象表示法声明的,并包含方法和属性。
我希望它可以清除两个问题。
q1:为什么它们指向功能?
a1:因为它们是功能。Function
和Object
只是构造函数函数。
功能是Function object
。对象是Object object
。
Q2:如果所有内容都是JavaScript中的对象,那么Object
为什么是函数?
a2:因为 Object
只是构造函数函数。
typeof Object
// 'function'
typeof new Object()
// 'object'
和a函数是Function
的实例,因此使函数成为对象。
(function(){}) instanceof Function
// true
从根本上
Functions
具有一些可以执行的代码。
Object
是包含数据的那些。
对于具有x
和y
的类Point
。
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
是功能。
同样,类Point
本身就是function
,当运行生成p
时。这就是为什么Object
和Functions
之类的所有类都是functions
更精确的constructor functions
。
答案2
如果一切都是javaScript中的对象,那么
Object
为什么是函数?
与答案1。
相同另外,javaScript中实际实现的函数如何?
不同的JavaScript引擎将具有不同的实现。他们有需要遵循的规格。
函数内声明的变量会发生什么?
主题。每个function
都有一个范围,该范围保存该功能的所有数据。
javaScript编译器将函数转换为对象?
不确定您在问什么。
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-sec-object-type解释了对象类型。从本质上讲,它是属性和/或登录器的集合(想想Getter/Setter)。这也介绍了术语"函数对象"。
- https://www.ecma-international.org/ecma-262/9.0/index.html#sec-sec-object-internal-methods-and-internal-nternal-slots显示了对象的内部语义,内部方法等。在该节的末尾,特别是,描述了"函数对象"特定的内部设备("呼叫"one_answers"构造"),其中包括诸如构造函数可选之类的细节。
因此,要回答您的问题:Foo
只能是一个对象(因为菜单上的其他所有内容都是基本值类型)。因此,Foo()
是一种特殊的语法,只需调用该对象的内部Call
方法即可。但是Foo
本身就是一个对象,您可以使用其他任何对象都可以做的其他所有操作,包括在其上设置任意属性。
在对象上定义的方法只是意味着该名称中有一个属性,而属性引用了一个恰好是"函数对象"的对象。
可以用作构造函数的东西再次是一个恰好具有Construct
内部方法的对象,而句法糖称为。
您知道,JavaScript中没有类,它是一种基于原型的对象的语言(它是 object - 面向您所能获得的,它实际上没有其他东西)。因此,任何类型的"原型"都是对象之间的链接。构造函数方法(如上所述所述)简单地调用构造函数方法,其称为对象(即 String
之类的对象)作为一个参数,就像语言将Call
称为 this
的语言一样, CC_71是对象。已被调用。因此,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
是所有函数的构造函数(包括本身...)
so,尽管并非所有内容都是函数,但是大多数大写本机标识符是指构造函数函数。
是,对象是类型函数。这是一个类/函数实现,当使用新的(new Object()
)调用时,它将导致具有分配内存的对象。