まず、 にメソッドを追加したくありませんFunction.prototype
。そうすることで、それらをすべての機能で利用できるようになりますが、それは私が探しているものではありません。
JavaScript では、次のようなカスタム プロトタイプを使用してオブジェクトを作成できます。
function CustomObj() {}
CustomObj.prototype = {};
CustomObj.prototype.sayFoo = function () { return 'foo' };
var myCustomObj = new CustomObj(); //=> returns an object: {}
myCusomObj.sayFoo(); //=> 'foo'
次のようなカスタム プロトタイプを使用して、配列のようなオブジェクトを作成することもできます。
function CustomArr() {}
CustomArr.prototype = [];
CustomObj.prototype.sayFoo = function () { return 'foo' };
var myCustomArr = new CustomArr(); //=> returns an ordered object: []
myCustomArr.sayFoo(); //=> 'foo'
私がやりたいのは、ある種のコンストラクターを使用して、同じ方法で独自のカスタム プロトタイプを持つ関数を作成することです。ただし、次の場合は機能しません。
function CustomFn() {}
CustomFn.prototype = function () {};
CustomFn.prototype.sayFoo = function () { return 'foo' };
var myCustomFn = new CustomFn(); //=> PROBLEM! returns an object: {}
myCustomFn.sayFoo(); //=> 'foo'
// ^^ Here, the prototype was applied but the output was not a function.
myCustomFn(); //=> TypeError: object is not a function
私がやろうとしていることを達成する方法はありますか?
アップデート
この質問をもう少し明確にする別の方法があるかもしれません。
閉鎖の考え方には問題があります:
function makeFn() {
var output = function () { /* do some stuff */ };
output.foo = function () { /* do some stuff */ };
return output;
}
var specialFn = makeFn();
本質的に、このテクニックは私が望むものを与えてくれます。makeFn
ただし、問題は、を呼び出すたびにoutput.foo
、独自のメモリを占有する完全に独立した関数として作成する必要があることです。きもい。したがって、そのメソッドをクロージャーから移動できます。
var protoMethods = {
"foo" : function () { /* do some stuff */ }
};
function makeFn() {
var output = function () { /* do some stuff */ };
for (var i in protoMethods) {
Object.prototype.hasOwnProperty.call(protoMethods, i) &&
(output[i] = protoMethods[i]);
}
return output;
}
var specialFn = makeFn();
しかし今では、呼び出すたびに手動で反復を行う必要がmakeFn
ありprotoMethods
、output
. それで、この新しいアップデートで、何かアイデアはありますか?