あなたはそこに比喩を混ぜているようなものです。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");
};
});
実例| ソース