我正在潜入(或尝试)高级javascript主题,如原型,构造函数,函数属性等等。一些事实让我得出结论, javascript函数也是对象。
我知道函数的数据类型为function
,因为:
> typeof function(){}
'function'
但无论如何:
length
属性 Function.prototype
的原型是Object.prototype
(原型链接):
> Object.getPrototypeOf(Function.prototype) === Object.prototype
true
有人可以说清楚javascript函数是否是对象?如果是这样,为什么typeof function == 'function'
和typeof [] == 'object'
;如果不是 - 我上面提到的要点怎么样?
编辑:还有一个问题 - 什么是第一类对象?
答案 0 :(得分:4)
所有(几乎)都是javascript中的对象。
Function instanceof Object // true
答案 1 :(得分:2)
是的,函数是javascript中的对象。这就是为什么((function(){}) instanceof Object
是真的。
typeof function == 'function'
,因为它们也是功能。函数继承自Object原型。
使用object initializer(object literals,array literals,new Constructor进行实例化的任何内容都将具有“对象”类型。
答案 2 :(得分:0)
这部分已经被其他答案解决了,但是,函数是对象。所以,关于你的其他问题。
为什么typeof function =='function'和typeof [] =='object'
typeof
运算符遵循规范中定义的某个set of rules:
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的功能性。
答案 3 :(得分:0)
我在早期学习JavaScript时遇到了这个问题。这是JavaScript的核心概念:函数ARE对象。但是,对象不一定是函数。原因? “函数”类型表示适用于其他对象和变量的过程或方法。因此,他们选择名称“function”而不是创建一个名为“function object”的类型。即使在最高级别的程序员中,这也造成了进一步的混乱。
但简单地说,功能是对象。因此,它们也可以包含自己的属性(就像任何对象一样)。此时,您可以创建此函数包含的私有变量/对象以及每个新实例获取的对象。需要注意的是,函数中包含的任何对象都不具有全局范围。 “Object.prototype”中的对象具有全局范围(并且始终存在)。
要回答您的上一个问题,第一类对象通常是在传递,创建或修改方式方面没有限制的实体。下一级(第2级,第3级......)具有限制其使用的限制层。显然,所有这些用例都很好。
编辑:我知道每个人都要他死。但请查看Douglas Crocford的教诲。他很好地研究了高级JS。