我可以从您最近的问题中看出您正在像 Java 一样思考,但事实并非如此。
第一个问题:
responseXML
每个浏览器都不同。Firefox提供了一个nsIDOMDocument
,IE提供了一个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
您不妨接受函数是公开的。你可以更进一步,完全放弃课程。对象只是碰巧具有某些功能的对象,这些功能甚至可以与完全不同的对象共享。