我们怎样才能证明javascript函数是对象?

时间:2017-01-28 09:26:44

标签: javascript function object

我正在使用

var foo = function(){}

typeof(foo) - 返回函数而不是Object

虽然javascript概念告诉javascript中的所有函数都是对象?

5 个答案:

答案 0 :(得分:6)

首先,事实上规范在很多地方明确说明了他们的对象,包括here,它定义了术语"功能&#34 ;:

  

<强>功能

     

可以作为子例程调用的Object类型的成员

根据经验,有很多方法可以证明它,但最简单的方法之一是为其上的属性赋值:

&#13;
&#13;
var foo = function() { };
foo.myProperty = "my value";
console.log(foo.myProperty); // "my value"
&#13;
&#13;
&#13;

或者使用一个作为原型(这是不寻常的,但可能),这证明它只是对象可以是原型:

&#13;
&#13;
var foo = function() { };
var obj = Object.create(foo);
console.log(Object.getPrototypeOf(obj) === foo); // true
&#13;
&#13;
&#13;

答案 1 :(得分:1)

测试怎么样

'static

对整数执行相同操作将导致未定义的赋值

>  x = function(){}
<- function (){}
>  x.a = "Asd"
<- "Asd"
>  x
<- function (){}
>  x.a
<- "Asd"

答案 2 :(得分:1)

查看我的list of proper ways to test if a value belongs to the Object type

他们将函数检测为对象,例如

var func = function(){};
Object(func) === func; // true  -->  func is an object

如果您需要更正式的证明,则需要查看规范,例如ECMAScript Overview

  

函数是可调用对象

答案 3 :(得分:1)

你可以非常简单地证明这一点:

console.log(Object.getPrototypeOf(Function.prototype));
console.log(Object.prototype === Object.getPrototypeOf(Function.prototype));

// or, being evil
Object.prototype.testFn = () => console.log('Exists on all objects');
({}).testFn();
[].testFn();
(new Number(5)).testFn();
Math.sqrt.testFn();

前两行表明原型链中Function.prototype之后的下一步是Object.prototype

其他行显示您可以向Object.prototype添加属性(严重不要执行此操作)并且它存在于所有对象上。在这种情况下,我们在空对象,空数组,Number对象和Math.sqrt函数上测试它。通过向Object.prototype添加属性(在这种情况下为函数),所有其他属性也获得了属性。

答案 4 :(得分:0)

console.log(Function.prototype instanceof Object);