0

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

例如,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;
4

2 回答 2

0

我可以从您最近的问题中看出您正在像 Java 一样思考,但事实并非如此。

第一个问题:
responseXML每个浏览器都不同。Firefox提供了一个nsIDOMDocumentIE提供了一个IXMLDOMDocument和 Webkit 浏览器取决于responseType设置但可能会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

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

于 2011-11-06T23:53:49.623 回答
0

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

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

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

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

请记住:JavaScript 没有这样的类,但如果您认为值得费心,您可以模拟它们。

于 2011-11-06T23:29:00.017 回答