0

我有以下代码:

    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

编辑:我没有得到我在评论中写的内容作为输出。

4

2 回答 2

5

你在那里混合了隐喻。三个选项供您选择:

  • 功能性
  • 简单的构造函数,覆盖每个实例(你想要做什么)
  • 可重用的原型继承

功能性

听起来你喜欢 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");
    };
});

实例| 来源

于 2012-04-17T16:03:40.970 回答
0

你就不能这样做吗?

function Foo(options) {
    o = $.extend({}, defaults, options);
    this.test = o.test;
}
于 2012-04-17T16:03:08.403 回答