2011-11-06 124 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