我正在尝试创建一个继承自特定函数返回的对象的原型/类。但我不知道该对象的名称是什么?
对于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;
答案 0 :(得分:0)
您不应在同一篇文章中包含不相关的问题。解决关于在“类”中声明函数的第二个问题:
你的第一个语法,在构造函数中声明它,每次调用构造函数时,都会指向覆盖myClass.prototype.publicFunct
以指向新创建的函数。也就是说,您将在每次调用构造函数时创建函数的额外副本,myClass.prototype.publicFunct
始终指向最近创建的副本 - 或者在构造函数至少被调用一次之前未定义。不要这样做。
您的第二个选项只是JavaScript中的无效语法。
首选您的第三种语法。这会将函数添加到原型一次。
请记住:JavaScript没有这样的类,但如果您认为值得麻烦,可以对它们进行模拟。
答案 1 :(得分: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中没有任何私有函数,因此“公共”没有位置,所有成员函数都是公共的。如果在某些时候你需要一个私有函数,你可以用一个闭包伪造效果。
(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
你也可以接受这些功能是公开的。你可以更进一步,完全放弃课程。对象只是恰好具有某些功能的对象,甚至可以与完全不同的对象共享这些功能。