По вашим недавним вопросам я могу сказать, что вы думаете, как Java, но это не так.
Первый вопрос:
responseXML
отличается для каждого браузера. Firefox дает nsIDOMDocument
, , IE дает IXMLDOMDocument
, а браузеры Webkit зависят от responseType
настройки , но, вероятно, будут Document
.Поскольку вы не можете предсказать, что это будет, прекратите пытаться его расширить.В большинстве случаев тип не доступен API-интерфейсом браузера, поэтому javascript все равно не может его расширить.
Более того, поскольку наследование JavaScript не основано на классах, вы вынуждены сделать это:
XMLHandler.prototype = new XMLDocument();
... который просто не работает для вашей цели.Любой экземпляр XMLHandler
будет построен на несвязанном, пустом документе, а не на документе, возвращенном responseXML
.Вы должны использовать обертку здесь.
Второй вопрос:
Из ваших трех методов первый эквивалентен последнему, но более расточительный, потому что он многократно устанавливает одну и ту же функциюк тому же прототипу.Второе бессмысленно, синтаксис нарушен.Вот ваши реальные варианты:
// 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");
}
};
Я бы использовал прототип для повышения эффективности, если вам не нужно выборочно добавлять функции в класс.Использование вами «публичной функции» (также «класса») кажется еще одним признаком фона ООП: в JavaScript нет никаких частных функций, поэтому «публичной» не место, все функции-члены являются публичными.Если в какой-то момент вам нужна частная функция, вы можете подделать эффект с помощью замыкания.
(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
Вы можете также признать, что функции являются публичными.Вы можете пойти еще дальше и вообще отказаться от занятий.Объекты - это просто объекты, у которых есть некоторые функции, и эти функции могут даже использоваться совместно с совершенно разными объектами.