你在那里混合了隐喻。三个选项供您选择:
- 功能性
- 简单的构造函数,覆盖每个实例(你想要做什么)
- 可重用的原型继承
功能性
听起来你喜欢 Douglas Crockford 喜欢的函数继承形式,它摒弃了原型,取而代之的是他所谓的“制造者”函数:
var f = makeFoo({
test: function() {
alert('Test2');
}
});
var f1 = makeFoo({
test: function () {
alert('Test3');
}
});
f.test();
f1.test();
...在哪里makeFoo
:
function makeFoo(options) {
return $.extend({}, makeFoo.defaults, options);
}
makeFoo.defaults = {
test: function() {
alert("Default test");
}
};
实例| 来源
我自己不是它的忠实粉丝,但有很多人喜欢而且肯定喜欢大多数东西,它有优点也有缺点。优点之一是它非常简单。
简单的构造函数,覆盖每个实例
但是您可以使用构造函数来做到这一点,就像您尝试过的那样;您将选项应用于this
而不是创建自己的单独对象:
function Foo(options) {
$.extend(this, options);
}
Foo.prototype.test = function() {
alert("Default test");
};
var f = new Foo({
test: function() {
alert("Test2");
}
});
var f2 = new Foo({
test: function() {
alert("Test3");
}
});
f.test();
f2.test();
实例| 来源
可重用的原型继承
如果您想更进一步并基于原型继承拥有适当的层次结构(因此您可以创建多个具有特定覆盖test
功能的对象),则需要做更多的工作,但您的优势在于调用“超级"的函数版本可以非常简单。管道非常复杂,我为此使用了一个库,在我的例子中,我自己的库名为Lineage
,但 Prototype 有类似的名称Class
,还有其他几个。
在进行原型继承时,您有构造函数,然后用它们构造实例。上面可能看起来像这样Lineage
:
var ParentFoo = Lineage.define(function(p) {
p.test = function() {
alert("Default test");
};
});
var FooChild1 = Lineage.define(ParentFoo, function(p) {
p.test = function() {
alert("Test2");
};
});
var FooChild2 = Lineage.define(ParentFoo, function(p) {
p.test = function() {
alert("Test3");
};
});
实例| 来源