是javaScript中的`object'函数



考虑此功能:

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:为什么它们指向功能?FunctionObject实际上是什么,它们彼此之间有何不同,因为 Object实际上是函数?:

typeof Object
"function"

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

对不起,如果我错过了明显的东西。我真的很困惑函数和对象在JavaScript中实现。

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

一个对象是JavaScript中的一个概念,是某些数据的通用容器。一个对象包含带有密钥和关联值的属性。

在JavaScript中,所有不是原始的都是对象。这包括函数,基本上是一种特殊类型的对象,可以用()语法"称为"。

JavaScript提供了许多具有各种目的的内置功能。两个这样的功能恰好称为ObjectFunction。换句话说, 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关键字调用的函数称为"构造函数函数"。ObjectFunction都是构造函数函数的示例,这就是为什么它们的名称以大写字母开头(JavaScript中的约定)。

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

console.log(bar.constructor == Bar) // prints true
console.log(bar.__proto__ == Bar.prototype) // prints true

this也用于其他事物,但这是一个广泛的主题,并且不超出此问题的范围。

函数和对象都是构造函数函数,可用于创建功能和对象,这是typeof Function返回function的原因。

关于JavaScript中函数和对象如何相关,请考虑以下几点:

  1. 所有非主要类型都是JavaScript中的对象。
  2. 所有对象直接或间接从object.protype继承(除非使用setPrototype Fiptype更改原型)。
  3. 所有本机函数从function.protype继承。
  4. 函数被视为对象的原因是因为它们可以作为参数传递到其他功能,并且可以从函数(即高阶函数)返回(JavaScript的强大功能)。
  5. 可以使用()运算符调用函数,因为JavaScript引擎知道它是使用函数关键字声明并具有可执行代码的。因此,只要称呼它,JavaScript引擎就会创建新的执行上下文并设置this绑定并执行该函数。当您尝试调用对象而不是抛出错误时,这些都不会发生,即"不是函数"。

    因此,我们可以说并非每个对象都是一个函数,因为它们可能没有使用函数关键字声明而没有可执行的代码。

  6. 当该函数被视为JavaScript中的对象时,我们可以向其添加属性,从中创建新对象。
  7. 无法使用()调用一个非功能类型对象,因为它没有可执行的代码,也没有使用函数关键字声明。相反,它是使用new Object()或对象表示法声明的,并包含方法和属性。

我希望它可以清除两个问题。

q1:为什么它们指向功能?

a1:因为它们是功能。FunctionObject只是构造函数函数。

功能是Function object。对象是Object object

Q2:如果所有内容都是JavaScript中的对象,那么Object为什么是函数?

a2:因为 Object只是构造函数函数。

typeof Object
// 'function'
typeof new Object()
// 'object'

和a函数是Function的实例,因此使函数成为对象。

(function(){}) instanceof Function
// true

从根本上

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

对于具有xy的类Point

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

答案1

在此中,pobject,其中包含数据或其他功能。

p.isOrigin是功能。

同样,类Point本身就是function,当运行生成p时。这就是为什么ObjectFunctions之类的所有类都是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())调用时,它将导致具有分配内存的对象。

最新更新