2011-08-08 50 views
9

澄清:
“JavaScript构造”应该更恰当地写为“JavaScript构造”强调的是,考虑的构造不只是本地JavaScript语言构造,比如对象,数组功能等也是别人,外在于JavaScript语言定义,但是是浏览器固有的,例如XMLHttpRequest。“JavaScript”这个词意在表明这些构造函数是使用JavaScript表达和访问的。为什么有些JavaScript构造函数不起作用?

一些参考:

修辞学,有引用构造器功能但不是构造器对象

(滑稽,这是因为对象的功能,和函数是对象!
Why in JavaScript is a function considered both a constructor and an object?
更具体地,对象,或是,OBJ-鸡蛋?, 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 (清晰)Firefox/3.6。3

[对象选项]

[对象图像]

[对象音频]

[对象贮藏]

[对象的XMLHttpRequest]

[对象工人]

[object FileReader]

但...

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

(其产生

功能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 (清晰)Firefox/3.6。3

函数阵列(){ [本地代码]}

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

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

函数Function(){ [native code]}

function Number(){ [native code]}

功能对象(){ [本地代码]}

功能正则表达式(){ [本地代码]}

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

功能错误(){ [本地代码]}

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

+0

'功能对象()的范围{[本地代码]}'显然对象的函数。 (我的舌头在我的脸颊,我很厚颜无耻,但,,,) – Ekim

+0

这里有一些对象的ARE功能: 'javascript:x = y = z = Object; alert([x,y,z] .join(“\ n \ n”))' 重申,每个Object都是一个函数! (不是每个对象!) – Ekim

回答

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工作,我不知道)。

还要记住,DOM接口的行为可能与原生JavaScript对象的行为不同。

在另一方面,在toString方法给出了这样:

[object Function] 

[object Function] 

[object Function] 

function Storage() { [native code] } 

function XMLHttpRequest() { [native code] } 

function Worker() { [native code] } 

function FileReader() { [native code] } 
+1

'typeof存储===“chrome12中的”函数“ – Raynos

+0

@Raynos:我刚刚注意到了...... –

+0

声明”对象是函数!“被认定为荒谬 - 但...对象是函数实例化!没有函数,没有实例化,没有实例化,通过'new',没有对象! (除了像{{property1:value1,property2:value2}这样的文字和预定义的实体) – Ekim

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,阿伦)

这里有一些更多的资源:

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

正如你所看到的主机对象被建议在稻草人中进行标准化处理,因此它是否在空气中是否能够成为ES6。然而,生活在ECMA土地上的功能对象应该在和谐建议页面中定义的ES6中采用标准化的toString方法。

+0

“15.3.4.2 Function.prototype.toString( )一个依赖于实现的表示形式...具有FunctionDeclaration的语法。“ Chrome的'function Worker(){[native code]}'符合条件,但'[object Worker]'不符合 – Ekim

+0

so ...为什么'Image','Option'等符合? “已知问题”? – Ekim

+0

@ekim请再次区分Host对象(浏览器和DOM的一部分)和ES对象。Host对象可以做任何他们想做的事情,因为它们是主机对象,它们是非标准的。 – Raynos

1

的问题实际上可能被转述为:

“?难道的JavaScript(ECMAScript的)语言约定适用于和削弱其他浏览器的组件,如该接口的DOM编程对象”

原始问题使用的对象被认为是Function类型,并用作构造函数。这些示例显示了编程环境和DOM界面在表现方式上存在二分法。

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

这可能是实际问题。如果是这样,原来的问题应该在此之前,以关注真正的问题。

引用:

ECMAScript语言constructor细节:

相关问题