我一直在努力创建一个带继承的函数/对象太久了。我认为我的问题在于函数/对象是用参数创建的。我已经查看了在这里扩展JavaScript函数/对象的所有示例(包括https://stackoverflow.com/a/10430875/489865,它有效地讨论了我的部分问题)和其他地方,但找不到我需要的东西。
目标是“整齐地”创建和包装XML对象。 (与XML有关的事实不应与问题/答案相关。)所有文档都会有一些共同的属性/功能,以及一些针对不同文档实例的特定属性/功能。这是我的代码的骨架,带有注释:
// base common function/object for all XML documents
// creates an XML document by deserializing text
// and has a function for serializing to text
var XMLDoc = function (xmlText)
{
this._xmlDoc = $.parseXML(xmlText);
XMLDoc.prototype.serialize = function () { return serialized(this._xmlDoc); }
}
// extend base with a bunch of common functions
$.extend(XMLDoc.prototype, {
doc: function () { return this._xmlDoc; },
find: function (selector) { return $(this._xmlDoc).find(selector); }
});
// start defining specific-instance-methods
// *** I THINK THIS IS WHERE I AM GOING WRONG ***
var XMLDocInstance1 = XMLDoc;
// extend particular instance with specific methods
$.extend(XMLDocInstance1.prototype, {
specific1: function () { ... }
});
// create specific instance
// I like this "new" way; note that XMLDocInstance1 takes a parameter
var xmlDocInstance1 = new XMLDocInstance1("<element1 />");
到目前为止,这似乎工作正常。然后我当然来添加另一个特定于实例的内容:
var XMLDocInstance2 = XMLDoc;
$.extend(XMLDocInstance2.prototype, { ... });
var xmlDocInstance2 = new XMLDocInstance2("<element2 />");
于是我发现xmlDocInstance2
具有xmlDocInstance1
的所有属性,反之亦然......
我意识到这是因为语句var XMLDocInstance1 = XMLDoc;
表示XMLDocInstance1
与XMLDoc
是同一个对象,所以我的$.extend(XMLDocInstance1.prototype)
实际上是XMLDoc.prototype
,这是我不想要的。在扩展之前,我需要XMLDocInstance1
作为XMLDoc
的某种副本开始。
我已尝试extend
上的各种变体(例如var XMLDoc = $.extend({}, XMLDoc;)
)但未成功。根据某个地方的建议,我尝试var XMLDocInstance1 = new XMLDoc;
(注意不 new XMLDoc()
),它有正确的“感觉”来获取副本,但它仍然执行{{1}身体,当然失败了。
我如何实现我的需求?我是以错误的方式去做的吗?我想使用XMLDoc
(而不是$.extend()
),但我愿意接受其他建议。