.responseXML()返回了什么对象?

时间:2011-11-06 21:38:07

标签: javascript ajax xmlhttprequest activexobject

我正在尝试创建一个继承自特定函数返回的对象的原型/类。但我不知道该对象的名称是什么?

对于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 :(得分:0)

您不应在同一篇文章中包含不相关的问题。解决关于在“类”中声明函数的第二个问题:

你的第一个语法,在构造函数中声明它,每次调用构造函数时,都会指向覆盖myClass.prototype.publicFunct以指向新创建的函数。也就是说,您将在每次调用构造函数时创建函数的额外副本,myClass.prototype.publicFunct始终指向最近创建的副本 - 或者在构造函数至少被调用一次之前未定义。不要这样做。

您的第二个选项只是JavaScript中的无效语法。

首选您的第三种语法。这会将函数添加到原型一次

请记住:JavaScript没有这样的类,但如果您认为值得麻烦,可以对它们进行模拟。

答案 1 :(得分:0)

我可以通过你最近的问题告诉你,你在想Java,这不是。

第一个问题:
responseXML对于每个浏览器都不同。 Firefox提供nsIDOMDocumentIE提供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中没有任何私有函数,因此“公共”没有位置,所有成员函数都是公共的。如果在某些时候你需要一个私有函数,你可以用一个闭包伪造效果。

(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

你也可以接受这些功能是公开的。你可以更进一步,完全放弃课程。对象只是恰好具有某些功能的对象,甚至可以与完全不同的对象共享这些功能。