功能真的是一个对象

时间:2010-10-15 11:21:34

标签: javascript function object

我是一名自学成才的网络开发人员,我仍然试图掌握一些JavaScript基础知识。以下是从Douglas Crockford的Good Parts中提取的一些引用。

“JavaScript中的函数是对象”

“在JavaScript中,数组是对象,函数是对象,正则表达式是对象,当然,对象是对象”

“每个对象都链接到一个原型对象,它可以从中继承属性”(即构造函数,toString,...)

如果Function是一个Object,那么为什么

 console.log(typeof Function);  // function 

是一种功能而非对象

 console.log(Object.constructor);  // Function()

是“父”的构造函数

 console.log(Function.constructor);  // Function()

困惑所以构造函数实际上是一个函数?

 console.log(typeof Function.prototype); // Function

是原型的一种功能,而不是一个对象? 我认为它继承自Object

这些问题的答案将极大地帮助我理解JavaScript。

5 个答案:

答案 0 :(得分:9)

  

如果Function是一个Object,那么为什么它的类型是函数而不是对象?

因为typeof运算符是这样定义的,可能是为了可用性:

  • 对象(本机且未实现[[Call]])返回“object”
  • 对象(本机或主机并实现[[Call]])返回“function”
  • 对象(主机并未实现[[Call]]) 返回一个实现定义的值,该值可能不是“未定义”,“布尔”,“数字”或“字符串”。

[[Call]]是对象的内部属性,它将对象标识为函数(可调用)。非本机对象是主机(例如浏览器)提供的对象,例如DOM对象或ActiveXObject的实例。

  

困惑所以构造函数实际上是一个函数?

为什么不呢?构造函数是函数。实例只能使用函数构造。 Object.constructor是一个函数,但它也是一个对象。请参阅以下内容:

console.log((function () { }) instanceof Object);
//-> true

另外,从ECMAScript speficiation:

  

每个内置函数和每个内置构造函数都有Function原型对象,它是表达式Function.prototype(15.3.4)的初始值,作为其[[Prototype]]内部属性的值。

     

除非另有说明,否则每个内置原型对象都有Object原型对象,它是表达式Object.prototype(15.2.4)的初始值,作为其[[Prototype]]内部属性的值,除了对象原型对象本身。

而且,还要回答你最后的困惑:

  

Function原型对象本身就是一个Function对象(它的[[Class]]是“Function”),当被调用时,它接受任何参数并返回undefined。

答案 1 :(得分:4)

当我们说“一个功能是一个对象”时,我们并不是说“是”而不是“而不是”,我们的意思与“猫是动物”的意思相同。如果有人问你有什么样的宠物,你就不会回答“动物”。如果typeof总是回复object,那么typeof将毫无用处。

函数是一个对象,但{{1}}返回并不是一件有趣的事情,因为它是语言本身的静态质量,而不是需要在运行时报告的东西。

答案 2 :(得分:1)

如果typeof运算符总是返回“对象”,它将毫无用处,不是吗?一切都是一个对象,但它也可以是其他东西。例如,字符串是一个对象,但它也是一个字符串:)运算符返回最具体类型的名称,而不是最通用的类​​型。这应该解释为什么typeof Function是“功能”。

对于constructor属性,构造函数是在创建对象时由运算符new调用的函数。它始终是一个函数,无论对象本身是ObjectFunction还是其他东西。

答案 3 :(得分:0)

console.log(typeof Function);表示该对象的类型为Function,而非object

举个例子:

function squareValue(var x) {
    return x * x;
}

可以松散地翻译为

var squareValue = new Function("x", "return x*x");

因此,做

var valueSquared = squareValue(x);

在这两个例子的任何一个中,都会产生相同的结果......

因此,为什么Javascript中的每个函数都是一个Function对象。

javascript对象/函数上的.constructor.prototype.toString是各自对象中的所有函数,因此您将输出作为“函数”。

这是根据ECMA-262 3rd Edition -December 1999

创建的

希望这有帮助。

答案 4 :(得分:0)

参考Is every JavaScript Object a function?

javascript:alert([ window.navigator.userAgent, Object, Function ].join("\n\n") )

显示器

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
      Ubuntu/10.04 (lucid) Firefox/3.6.3

function Object() {
    [native code]
}

function Function() {
    [native code]
}

javascript:alert([ new Object, new Function ].join("\n\n") )

显示器

[object Object]

function anonymous() {  }

javascript:alert([ new new Function ].join("\n\n") )

显示器

[object Object]