JavaScript / jQuery扩展函数,它接受参数

时间:2017-05-10 09:43:44

标签: javascript jquery prototypal-inheritance

我一直在努力创建一个带继承的函数/对象太久了。我认为我的问题在于函数/对象是用参数创建的。我已经查看了在这里扩展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;表示XMLDocInstance1XMLDoc是同一个对象,所以我的$.extend(XMLDocInstance1.prototype)实际上是XMLDoc.prototype,这是我不想要的。在扩展之前,我需要XMLDocInstance1作为XMLDoc的某种副本开始。

我已尝试extend上的各种变体(例如var XMLDoc = $.extend({}, XMLDoc;))但未成功。根据某个地方的建议,我尝试var XMLDocInstance1 = new XMLDoc;(注意 new XMLDoc()),它有正确的“感觉”来获取副本,但它仍然执行{{1}身体,当然失败了。

我如何实现我的需求?我是以错误的方式去做的吗?我想使用XMLDoc(而不是$.extend()),但我愿意接受其他建议。

0 个答案:

没有答案