为什么有些JavaScript构造函数不是函数?

为什么有些JavaScript构造函数不是函数?,javascript,constructor,Javascript,Constructor,澄清: “JavaScript构造函数”应更恰当地写成“JavaScript构造函数”,以强调所考虑的构造函数不仅是本机JavaScript语言构造函数,如对象、数组、函数等,还包括其他JavaScript语言定义之外但浏览器固有的构造函数,例如XMLHttpRequest,单词“JavaScript”表示使用JavaScript表示和访问这些构造函数 一些参考资料: 在中使用构造函数 “构造函数 指定创建对象原型的函数“ 在 例如:“…调用Worker()构造函数…” 从修辞上讲,

澄清:
“JavaScript构造函数”应更恰当地写成“JavaScript构造函数”,以强调所考虑的构造函数不仅是本机JavaScript语言构造函数,如对象、数组、函数等,还包括其他JavaScript语言定义之外但浏览器固有的构造函数,例如
XMLHttpRequest
,单词“JavaScript”表示使用JavaScript表示和访问这些构造函数

一些参考资料:

  • 在中使用构造函数
  • 构造函数

    指定创建对象原型的函数“
  • 例如:“…调用
    Worker()
    构造函数…”
从修辞上讲,有对构造函数函数的引用,但没有对构造函数对象的引用

(有趣的是,这是因为对象是函数,函数是对象!

更具体地说,对象(或obj Oggs?)忽略了文字实例,函数的实例化和函数是函数的对象实例。有争议的是,函数是对象存在的基础,这一事实证明了这一点
7.
在前面
8.
在MDN文档中,第8节I object!提供了使用构造函数和函数实例化创建对象所需的详细信息!)

为什么接口DOM的构造函数不是函数

javascript:
  alert([
    "using browser environment:  \n"+window.navigator.userAgent,
     Option, Image, Audio,
       Storage, XMLHttpRequest, Worker, FileReader,
   ] . 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

[对象选项]

[对象图像]

[对象音频]

[对象存储]

[对象XMLHttpRequest]

[对象工作者]

[对象文件读取器]

但是

javascript:
  alert([
             XPCNativeWrapper,
  ].join("\n\n"));
(产生

函数XPCNativeWrapper(){ [本机代码]}

)

和JavaScript语言是函数

javascript:
  alert([
    "using browser environment:  \n"+window.navigator.userAgent,
             Array, Boolean, Date, Function,
               Number, Object, RegExp, String,
                 Error, Iterator,
  ].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

函数数组(){ [本机代码]}

布尔函数(){ [本机代码]}

功能日期(){ [本机代码]}

函数函数(){ [本机代码]}

函数号(){ [本机代码]}

函数对象(){ [本机代码]}

函数RegExp(){ [本机代码]}

函数字符串(){ [本机代码]}

函数错误(){ [本机代码]}

函数迭代器(){ [本机代码]}

第一:

对象是函数

不,它们不是:

> a = function() {}
  function () {}
> a instanceof Object
  true
> b = {}
  Object
> b instanceof Function
  false

toString
方法(执行字符串连接时会调用该方法)不是获取对象信息的可靠方法。如果我使用
typeof
,我会得到以下结果:

using browser environment:  
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:5.0.1) Gecko/20100101 Firefox/5.0.1

function

function

function

object

function

function

function
所以你看,除了
存储
,它们中的大多数实际上都是函数(我不知道为什么它不适用于
存储

还要记住,DOM接口的行为可能不同于本机JavaScript对象

另一方面,在Chrome中,
toString
方法给出了以下内容:

[object Function] 

[object Function] 

[object Function] 

function Storage() { [native code] } 

function XMLHttpRequest() { [native code] } 

function Worker() { [native code] } 

function FileReader() { [native code] }

当您向这些值发出警报时,浏览器引擎正在向
value.toString()
发出警报,因此我们要讨论的是
函数.prototype.toString
的行为为何会有奇怪的表现

ES5.1规范规定:


15.3.4.2 Function.prototype.toString() 返回函数的依赖于实现的表示形式。此表示具有FunctionDeclaration的语法

请特别注意,空格、行终止符和 表示字符串中的分号取决于实现

toString函数不是泛型函数;如果其this值不是函数对象,则抛出TypeError异常。因此,不能将其传输到其他类型的对象以用作方法

显然,ES5声明
toString
返回特定于实现的字符串

如果您阅读该页,它会说明:

函数到字符串–对有问题的function.prototype.toString(markm,allen)有更高的规范

以下是更多的资源:

基本上,函数对象(尤其是也是函数的宿主对象)上的
toString
是一个未定义的行为,这是一个已知的问题。TC39委员会已经在进行标准化工作


正如您所看到的,在strawman中建议对宿主对象进行标准化,因此,是否将其纳入ES6尚待确定。但是,居住在ECMA土地上的功能对象在ES6中应该有一个标准化的
toString
方法,如harmony Propositions(和谐方案)页面上所定义的那样。

这个问题实际上可以解释为:

“JavaScript(ECMAScript)语言约定是否适用于并限定浏览器的其他组件,例如与DOM接口的编程对象?”

最初的问题使用了假定为Function类型并用作构造函数的对象。这些示例显示了编程环境和DOM接口在如何表示它们方面存在着二分法

如果存在这种实际的二分法,它是明确的吗

这可能是实际问题。如果是这样的话,在最初的问题之前应该加上这一点,以便将注意力引向真正的问题

参考资料:

语言
constructor
详细信息:

  • “每个内置构造函数都有函数原型对象”
    报价部分
  • “预计