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

时间:2011-08-08 20:20:57

标签: javascript constructor

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

一些参考文献:

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

(好笑,这是因为对象是功能,功能是对象! Why in JavaScript is a function considered both a constructor and an object?
更具体地说,对象,或者是obj-eggs?,ARE,忽略文字实例,函数和函数的实例化是函数的对象实例。可以说,功能是物体存在的基础,事实证明了这一点 7. Functions
 先
8. Working with Objects
在MDN文档JavaScript Guide中。第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 Image]

     

[object Audio]

     

[对象存储]

     

[object XMLHttpRequest]

     

[对象工人]

     

[object FileReader]

但......

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

(产生

  

function XPCNativeWrapper(){       [本地代码]}

和JavaScript语言constructors是函数。

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(){       [本地代码]}

     

function Boolean(){       [本地代码]}

     

function Date(){       [本地代码]}

     

function Function(){       [本地代码]}

     

function Number(){       [本地代码]}

     

function Object(){       [本地代码]}

     

function RegExp(){       [本地代码]}

     

function String(){       [本地代码]}

     

function Error(){       [本地代码]}

     

function Iterator(){       [本地代码]}

3 个答案:

答案 0 :(得分:4)

首先:

  

对象是函数

不,不是:

> 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,我不知道。)< / p>

还要记住,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] }

答案 1 :(得分:1)

当您提醒这些值时,浏览器引擎会提醒value.toString(),因此我们正在讨论为什么Function.prototype.toString会以一种奇怪的方式行事。

ES5.1规范声明:

  

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

     

请特别注意白色空间,线路终结器的使用和放置   表示字符串中的分号是依赖于实现的。

     

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

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

如果您阅读了ES Harmony proposals页面,请说明:

  

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

以下是更多资源:

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

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

答案 2 :(得分:1)

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

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

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

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

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

的引用:

ECMAScript语言constructor详细信息: