2010-10-15 21 views
3

我是一个自学Web开发人员,我仍然试图掌握一些JavaScript基础知识。以下是从Douglas Crockford的Good Parts中摘录的一些引用。功能真的是一个对象

“在JavaScript函数是对象”

“在JavaScript中,阵列是对象,函数是对象,正则表达式是对象,并且,当然,对象是对象”

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

如果Function是一个对象,那么为什么

console.log(typeof Function); // function 

是其类型的函数,而不是对象

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

是其 '父'

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

的构造困惑所以解释ctor实际上是一个功能?

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

是其原型的类型的函数,而不是一个对象? 我以为它继承了对象

回答这些问题将大大有助于我对JavaScript的理解。

回答

9

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

由于typeof运算符被定义那样,大概为可用性:

  • 对象(天然的和没有实现[[调用]])返回 “对象”
  • 对象(天然的或主机并执行[[Call]])返回“函数”
  • 对象(主机并没有实现[[Call]]) 返回实现定义的值,该值可能不是“未定义”,“布尔值”,“数字“或”字符串“。

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

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

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

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

此外,从ECMAScript的speficiation:

每个内置函数和每个内置构造所具有的功能的原型对象,其是表达功能的初始值。原型(15.3.4)作为其[[Prototype]]内部属性的值。

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

而且也回答你最后的困惑:

函数原型对象本身就是一个函数对象(它的[[等级]为“功能”),其被调用时,接受任何参数并返回undefined。

+1

+1感谢这个解释真的使事情变得更加清晰。 – 2010-10-15 11:42:19

4

当我们说“一个函数是一个对象”时,我们不是指“是”,而是“代替”,我们的意思是它与“猫是动物”的意思相同。如果有人问你是什么样的宠物,你不会回答“一只动物”。如果它总是回应object,那么typeof将毫无用处。

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

1

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

至于constructor属性,构造函数是在创建对象时由运算符new调用的函数。无论对象本身是否为Object,Function或其他,它总是一个函数。

+2

基元 - 字符串,数字和布尔值 - 不是对象,而是在尝试访问对象的属性或方法时隐式转换为对象。例如''jim“instanceof Object'将返回false,但是'new String(”jim“)instanceof Object'将返回true。 – 2010-10-15 11:36:33

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); 
在任何这些2个实例

,会产生相同的结果...

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

.constructor,.prototype,.toString关于javascript对象/函数都是在它们各自的对象中的函数,因此为什么你的输出为“函数”。

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

希望这有助于为主。

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] 
相关问题