【发布时间】:2013-07-30 22:44:49
【问题描述】:
我正在尝试使用 jquery 扩展来模拟继承,但据我所知,它仅适用于对象。
我想要完成的是:
var baseDefinition = function() {
var self = this;
self.calc1 = function() {
return "something1";
}
self.calc2 = function() {
return "something2";
}
self.myObject = {
propA = 100;
propB = 200;
};
}
var derivedDefinition = function() {
var self = this;
self.calc2 = function() {
return "something different from base";
}
self.myObject = {
propB = 400;
};
}
var instance = $.extend(true, {}, baseDefinition, derivedDefinition);
所以我希望从基本定义创建一个新实例,其中派生定义将应用于基本定义,但两个定义都不会被“触及”。有可能吗?
我希望避免任何原型,所以基本上我想调用 instance.calc1 或 instance.calc2 而不知道它是否被覆盖。
编辑:
在我的示例中,我没有包含任何导致我使用 jquery 扩展功能的对象属性。尽管两个答案都解决了内部函数“继承”,但它(显然)没有像 extend 那样合并对象属性。作为一种可能的解决方案,我在创建实例以循环遍历实例的属性并在它们上应用 jquery 的扩展后正在考虑。虽然这对我来说似乎效率低下,但我不知道您是否可以就其他行动方案给我建议。
【问题讨论】:
-
$.extend()只用另一个对象的内容更新一个对象中的键。如果链中的第一个对象是{},显然最终结果不会是函数。只需使用显式命名空间对象或常规 JS OO 功能即可。 -
你是怎么调用这些函数的?
-
@millimoose 我理解你对“命名空间”对象的意思,但这会覆盖整个函数“类”而不是它的覆盖。如果我错了,请告诉我。对于 JS OO,您的意思是使用原型?
-
@DevRios 是的,我的意思是 JS 中的机制已经提供了继承,而不是尝试自己滚动。
标签: javascript jquery