1

我正在潜入(或尝试)高级 javascript 主题,如原型、构造函数、函数属性等,一些事实让我得出结论,javascript 函数也是对象

我知道函数的数据类型是function,因为:

> typeof function(){}
'function'

但不管怎么说:

  • 您可以将属性分配给函数(就像它是一个对象一样)
  • 函数有它的length属性
  • Function.prototype的原型是Object.prototype(原型链):

    > Object.getPrototypeOf(Function.prototype) === Object.prototype
    true
    

有人可以弄清楚javascript函数是否是对象吗?如果是,为什么是typeof function == 'function'and typeof [] == 'object'; 如果不是 - 我上面提到的几点怎么样?

编辑:还有一个问题 - 什么是一流的对象

4

4 回答 4

4

一切(几乎)都是javascript中的一个对象。

Function instanceof Object  // true
于 2013-06-26T21:22:40.130 回答
2

是的,函数是 javascript 中的对象。这就是为什么((function(){}) instanceof Object是真的。

typeof function == 'function',因为它们也是函数。函数继承自 Object 原型。

任何用对象初始化器对象文字数组文字新构造器)实例化的东西都将具有“对象”类型。

于 2013-06-26T21:23:02.400 回答
0

我在早期学习 JavaScript 时遇到了这个问题。这是 JavaScript 的核心概念:函数是对象。但是,对象不一定是函数。原因?“函数”类型意味着对其他对象和变量起作用的过程或方法。因此,他们没有创建一个名为“函数对象”的类型,而是选择了名称“函数”。即使在最高级别的程序员中,这也引起了进一步的混乱。

但简单地说,函数就是对象。因此,它们也可以包含自己的属性(就像任何对象一样)。此时,您可以创建此函数包含的私有变量/对象,并且每个新实例都会获得这些私有变量/对象。需要注意的是,函数中包含的任何对象都不具有全局范围。然而,“Object.prototype”中的对象具有全局范围(并且始终存在)。

要回答您的最后一个问题,一流对象通常是在传递、创建或修改方式方面没有限制的实体。下一个级别(第 2、第 3、...)具有限制其使用的层级限制。显然,它们都有很好的用例。

编辑:我知道每个人都把他找死。但是看看道格拉斯·克罗克福德的教义。他很好地研究了高级 JS。

于 2013-06-26T22:23:08.763 回答
0

这部分已经被其他答案解决了,但是是的,函数是对象。所以,关于你的其他问题。

为什么 typeof function == 'function' 和 typeof [] == 'object'

typeof操作员只是遵循规范中定义的一组规则:

Type of val                    Result
----------------------------------------------
Undefined                      "undefined"
Null                           "object"
Boolean                        "boolean"
Number                         "number"
String                         "string"
Object (native and does        "object"
not implement [[Call]])        
Object (native or host and     "function"
does implement [[Call]])
Object (host and does not      Implementation-defined except may 
implement [[Call]])            not be "undefined", "boolean", 
                               "number", or "string".

什么是第一类对象?

据说函数是 JavaScript 中的“一等对象”或“一等公民”,因为作为常规对象,它们可以分配给变量,传递给其他函数,并由其他函数返回。这就是使 JavaScript 具有函数性质的原因。

于 2013-06-26T21:36:51.377 回答