2011-11-06 121 views
0

我想創建一個原型/繼承自特定函數返回的對象的類。但我不知道那個對象的名字是是?.responseXML()返回什麼對象?

對於實例var xhr = XMLHttpRequest();xhr.responseXML;返回什麼對象?是XMLDocument?或者XMLDOM
此外,如果我創建對象var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");並調用xmlDoc.load("xmlFile.xml");它會返回與xhr.responseXML;相同類型的對象嗎?

我努力做到以下幾點:

function XMLHandler() 
{ 
    this.xmlFile = "defaultXML.xml"; 
} 

// Make XMLHandler inherit from Javascript object 
XMLHandler.prototype = new XMLDocument(); 
XMLHandler.prototype.constructor = XMLDocument; 
+3

SO是問答網站,而不是論壇。單獨的問題應該是分開的。 – outis

+0

請刪除您的第二個問題,並通過右上角的Ask Question按鈕將其重新發布爲真正的第二個問題。 – BalusC

回答

0

你不應該包括在同一職位無關的問題。要解決關於在「類」中聲明函數的第二個問題:

在構造函數中聲明它的第一個語法將在每次調用構造函數時都明確地覆蓋myClass.prototype.publicFunct以指向新創建的函數。也就是說,您將在每次調用構造函數時創建函數的額外副本,並且myClass.prototype.publicFunct始終指向最近創建的副本 - 或者在構造函數被調用至少一次之前未定義。不要這樣做。

你的第二個選擇是JavaScript中無效的語法。

您的第三種語法是首選。這會將功能添加到原型一次

請記住:JavaScript沒有這樣的類,儘管如果您覺得值得費心,可以對它們進行模擬。

0

我可以告訴你最近的問題,你在想Java,但事實並非如此。

第一個問題:
responseXML是每個瀏覽器不同。 Firefox給出nsIDOMDocument,IE給出IXMLDOMDocument並且Webkit瀏覽器依賴於responseType setting,但可能是Document。既然你無法預測它會停止試圖擴展它。在大多數情況下,瀏覽器的API無法使用該類型,因此JavaScript無法擴展它。

而且,由於JavaScript的繼承不是基於類的你是被迫這樣做:

XMLHandler.prototype = new XMLDocument(); 

...這根本不適合你的目的的工作。 XMLHandler的任何實例都將建立在不相關的空文檔上,而不是由responseXML返回的文檔。你必須在這裏使用包裝。


第二個問題:
的3種方法的第一等同於最後更浪費的,因爲它可重複設置同樣的功能相同的原型。第二個是無意義的,語法被破壞。這些是你真正的選擇:

// Instance method, every instance is given a copy of the function upon "new" 
function MyClass() 
{ 
    this.publicFunct = function() 
    { 
     alert("public function"); 
    }; 
} 

// Prototypal method, only one copy of the function shared by all instances 
function MyClass() 
{ 
} 

MyClass.prototype.publicFunct = function() 
{ 
    alert("public function"); 
}; 

// Shorthand method, same as prototypal but handy for several members at once 
// It prevents MyClass from being a descendent of another type 
function MyClass() 
{ 
} 

MyClass.prototype = { 
    // A colon is only acceptable in object notation 
    publicFunct: function() 
    { 
     alert("public function"); 
    } 
}; 

我會去效率的原型方法,除非你需要有選擇地添加功能的類。您對「公共職能」(也稱爲「類」)的使用似乎是OOP背景的另一個症狀,JavaScript中沒有任何私有函數,因此「public」沒有位置,所有成員函數都是公共的。如果在某個時候你確實需要一個私人函數,你可以通過閉包僞造該效果。

(function() { 

    // Assignments are mostly global 
    MyClass = function() {}; 

    MyClass.prototype.publicFunct = function() 
    { 
     privateFunct(); 
    }; 

    // These statements affect local scope 
    var foo = 'bar'; 

    function privateFunct() 
    { 
     alert("public function"); 
    } 

})(); // These extra brackets cause the contents to be executed immediately 

雖然說很少需要私人函數,並且所有JavaScript都是可見的,所以它不是真正的祕密。上面可能會這樣挫敗:

thief = {}; 
MyClass.prototype.publicFunct.call(thief); 
// privateFunct is called by publicFunct in the context of the thief 

你可能會接受,功能是公開的。你可以進一步放棄課程。對象只是碰巧具有某些功能的對象,這些功能甚至可以與完全不同的對象共享。

+0

_「第一個相當於最後一個,但更浪費,因爲它重複將同一個函數設置爲同一個原型」 - 這比它更浪費,因爲它不是_same_函數:它重複創建一個新函數並分配它。在關於阻止私有函數的最後一個示例中,私有函數_is_仍然是私有函數 - 您不能直接調用它。 – nnnnnn