繁体   English   中英

为什么一些JavaScript构造函数不起作用?

[英]Why are some JavaScript constructors not functions?

澄清:
应该更恰当地将“JavaScript构造函数”编写为“javascript构造函数”,以强调所考虑的构造函数不仅仅是本机JavaScript语言构造函数,如Object,Array,Function等,还包括其他JavaScript语言定义的外在构造函数。但是浏览器固有的,例如XMLHttpRequest ,“JavaScript”一词意味着表示这些构造函数是使用JavaScript表达和访问的。

一些参考:

在修辞上,有对构造函数的引用,但不是构造函数对象

(好笑,这是因为Objects ARE功能,而Function是对象!
为什么JavaScript中的函数既是构造函数又是对象?
更具体地说,对象,或者是obj-eggs?,ARE,忽略文字实例,函数和函数的实例化是函数的对象实例。 可以说,功能是物体存在的基础,事实证明了这一点
7. 功能
先于
8. 使用对象
在MDN文档JavaScript指南中 第8节,我反对!,提供了使用构造函数和函数实例创建对象所需的细节!)

为什么与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

[对象选项]

[对象图片]

[对象音频]

[对象存储]

[object XMLHttpRequest]

[对象工作者]

[object FileReader]

但......

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

(产生

function XPCNativeWrapper(){[native code]}

和JavaScript语言构造函数是ARE函数。

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

function Array(){[native code]}

function Boolean(){[native code]}

function Date(){[native code]}

function Function(){[native code]}

函数Number(){[native code]}

function Object(){[native code]}

函数RegExp(){[native code]}

function String(){[native code]}

函数Error(){[native code]}

function Iterator(){[native code]}

第一:

对象是功能

不,不是:

> 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

所以你看,他们中的大多数除了形成Storage ,实际上函数(它为什么不为工作Storage ,我不知道)。

还要记住,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()因此我们讨论为什么Function.prototype.toString以奇怪的方式运行。

ES5.1规范规定:

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

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

toString函数不是通用的; 如果此值不是Function对象,则抛出TypeError异常。 因此,它不能转移到其他种类的对象用作方法。

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

如果您阅读ES Harmony提案页面,则说明:

函数到字符串 - 有问题的Function.prototype.toString(markm,allen)的更大规范

这是一些更多的资源:

基本上,一个已知的问题是toString on function objects(尤其是也是函数的宿主对象)是未定义的行为。 TC39委员会已经在努力使其标准化。

正如你所看到的那样,主机对象被建议在草编中标准化,所以无论是否进入ES6,它都在空中。 但是,生活在ECMA土地上的功能对象应该在和谐建议页面上定义的ES6中具有标准化的toString方法。

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

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

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

如果有这种实际的二分法,是否明确了?

这可能是实际问题。 如果是这样,原始问题应该在此之前引导注意真正的问题。

引用:

ECMAScript语言constructor详细信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM