我可以告訴你最近的問題,你在想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
你可能會接受,功能是公開的。你可以進一步放棄課程。對象只是碰巧具有某些功能的對象,這些功能甚至可以與完全不同的對象共享。
SO是問答網站,而不是論壇。單獨的問題應該是分開的。 – outis
請刪除您的第二個問題,並通過右上角的Ask Question按鈕將其重新發布爲真正的第二個問題。 – BalusC