我有以下代码:
var defaults = {
test: function () {
alert('Test');
}
};
function Foo(options) {
o = $.extend({}, defaults, options);
Foo.prototype.test = o.test;
}
Foo.prototype.test = defaults;
我希望测试方法应该是可扩展的,我希望它可以用作:
var f = new Foo({
test: function() {
alert('Test2');
}
});
var f1 = new Foo({
test: function () {
alert('Test3');
}
});
f.test();//alert(test2) should be called
f1.test(); //alert(test3) should be called
编辑:我没有把我在评论中写的内容作为输出。
答案 0 :(得分:5)
你在那里混合隐喻。有三种选择:
听起来你喜欢道格拉斯·克罗克福德喜欢的功能继承的形式,它取消了原型,支持他所谓的“制造者”功能:
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");
};
});
答案 1 :(得分:0)
function Foo(options) {
o = $.extend({}, defaults, options);
this.test = o.test;
}