2011-08-08 49 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細節:

相關問題