JavaScriptデコレータ

長い間、JavaScriptでデコレータを使用しています。 最近、不純物に関するhabrotopikを見ました。これは、テクノロジーが少し似ているため、自分の経験を共有するように促しました。

よく知られている実装で私に合わないものは何ですか?


Googleの最初のリンクで提供される実装は、Pythonの場合とは異なります。 多くの記事では、オブジェクトを作成し、そのフィールドに関数を入力し、これらのフィールドを使用して装飾を行わないことを提案しています。
最初のページには、私のものと同様の方法を使用するリンクがいくつかあります。
さらに多くの実装がありますが、それらは私には興味がありません。
私の観点から最も正しいことをお話しします。

通常のデコレータ


では、デコレータとは何ですか?
デコレータは、関数の引数関数を追加する関数です。

Pythonの例:
def superfunc(n=2): print("Megclosure created") def clos(func): print("Megclosure used") def clos1(*args, **kwargs): print("Megclosured function",func.__name__) res = func(*args, **kwargs) return (res**n) return clos1 return clos def a(par): return par+9; b = (superfunc())(a) @superfunc(3) def c(txt): return len(txt)+1 print ( b(1),c("abc"*3)) 

ここで何をしているの?
ここで、必要なことを実行し、装飾された関数を呼び出す別の関数を作成する関数を作成します。

JavaScriptでどのようになりますか


したがって、関数を呼び出し、関数と、場合によっては追加のパラメーターを渡して、装飾されていない関数bを取得します。
 function decorator(){ ..... } ..... function a(){ ...... } ...... var b=decorator(a, arg1, arg2,....., argN); 



ライブラリの 1つからコードを渡します
 function withVars(f, variables) { var args = Array.prototype.slice.call(arguments, 1);//    ,    ,    return function () {//  f  args,    var p = arguments;//   arguments     ... Array.prototype.push.apply(p, args);//...    p f.apply(this, p);//   f   this   p } }; 

そして適用:
 function a(){ var str =""; for(var i=0;i<arguments.length;i++){ str+=arguments[i]+" "; } alert(str); } a(1,2,4,5,"six");//1 2 3 4 5 six var b=withVars(a,4,8,15,16,23,42); b(1,2,4,5,"six");//1 2 3 4 5 six 4 8 15 16 23 42 

その結果、数行のコードで強力な効果が得られます。
手首を軽くたたくだけで、パラメーターを最初に追加するように機能をやり直すことができます。 これを行うには、単に置き換える
 Array.prototype.push.apply(p, args); f.apply(this, p); 


 Array.prototype.push.apply(args,p); f.apply(this, args); 

可能な用途





何を読む


JavaScript.ru-クロージャー
引数-MDN
適用-MDN

PS招待してくれたUFOに感謝します。

UPD1:いくつかの用途が追加されました。
UPD2:コードをわずかに修正

Source: https://habr.com/ru/post/J132682/


All Articles