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

あなたはそこに比喩を混ぜているようなものです。3 つのオプション:

  • 機能的
  • 単純なコンストラクター関数、インスタンスごとのオーバーライド (あなたがしようとしていたこと)
  • 再利用可能なプロトタイプの継承

機能的

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");
    }
};

実例| ソース

私自身はそれの大ファンではありませんが、ほとんどのものがそうであるように、長所と短所があります。利点の1つは、それがいかに簡単かということです。

シンプルなコンストラクター関数、インスタンスごとのオーバーライド

ただし、試したのと同じように、コンストラクター関数を使用して実行できます。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配管は十分に複雑なので、ライブラリを使用します。私の場合、私自身のライブラリは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 に答える