功能真的是一个对象

Q_M*_*ilo 3 javascript function object

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

"JavaScript中的函数是对象"

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

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

如果Function是Object,那么为什么

 console.log(typeof Function);  // function 
Run Code Online (Sandbox Code Playgroud)

它的类型是函数而不是对象

 console.log(Object.constructor);  // Function()
Run Code Online (Sandbox Code Playgroud)

它是'父母'的构造者

 console.log(Function.constructor);  // Function()
Run Code Online (Sandbox Code Playgroud)

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

 console.log(typeof Function.prototype); // Function
Run Code Online (Sandbox Code Playgroud)

它的原型类型是一个函数而不是一个对象?我认为它继承自Object

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

And*_*y E 9

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

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

  • 对象(本机且未实现[[Call]])返回"对象"
  • 对象(本机或主机并实现[[Call]])返回"function"
  • Object(host并不实现[[Call]])返回一个实现定义的值,该值可能不是"undefined","boolean","number"或"string".

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

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

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

console.log((function () { }) instanceof Object);
//-> true
Run Code Online (Sandbox Code Playgroud)

另外,从ECMAScript speficiation:

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

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

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

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


Ned*_*der 5

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

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