Какой объект возвращается .responseXML ()? - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь создать прототип / класс, который наследуется от объекта, возвращаемого определенной функцией.Но я не знаю, что такое имя этого объекта?

Для экземпляра 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;

Ответы [ 2 ]

0 голосов
/ 07 ноября 2011

По вашим недавним вопросам я могу сказать, что вы думаете, как 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

Вы можете также признать, что функции являются публичными.Вы можете пойти еще дальше и вообще отказаться от занятий.Объекты - это просто объекты, у которых есть некоторые функции, и эти функции могут даже использоваться совместно с совершенно разными объектами.

0 голосов
/ 07 ноября 2011

Вы не должны включать в этот пост посторонние вопросы. Чтобы ответить на ваш второй вопрос об объявлении функции в «классе»:

Ваш первый синтаксис, объявляющий его в конструкторе, будет бесполезно перезаписывать myClass.prototype.publicFunct, чтобы указывать на вновь созданную функцию каждый раз, когда вызывается конструктор. То есть вы будете создавать дополнительную копию функции при каждом вызове конструктора, при этом myClass.prototype.publicFunct всегда будет указывать на самую последнюю созданную копию - или не определяться, пока конструктор не будет вызван хотя бы один раз. Не делай этого.

Ваш второй вариант - просто неверный синтаксис в JavaScript.

Ваш третий синтаксис предпочтителен. Это добавит функцию к прототипу один раз .

Помните: в JavaScript нет классов как таковых, хотя вы можете имитировать их, если считаете, что это стоит того.

...