我是一名自学成才的网络开发人员,我仍然试图掌握一些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。
答案 0 :(得分:9)
如果Function是一个Object,那么为什么它的类型是函数而不是对象?
因为typeof运算符是这样定义的,可能是为了可用性:
[[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
调用的函数。它始终是一个函数,无论对象本身是Object
,Function
还是其他东西。
答案 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]