見出し画像

🛠️js動的プロキシとゴーストメソッドの違い

  • 使用されるメカニズム: JavaScript の Proxy はオブジェクト全体の操作をインターセプトし、Ruby の method_missing は特定のメソッドが存在しないときに限って呼び出されます。

  • 応用範囲: Proxy はプロパティアクセスや関数の呼び出しなど、様々な操作をカスタマイズ可能ですが、method_missing はメソッド呼び出しに特化しています。

  • パフォーマンス: JavaScript の Proxy は非常に柔軟ですが、パフォーマンスに影響を与えることがあります。Ruby の method_missing も多用するとパフォーマンス低下を招くことがあります。



ゴースト・メソッドと呼ばれるのは、呼び出すことはできても、利用可能なメソッドのリストに表示されなかったり、明示的に定義されなかったりするためです。存在するけれども、見えない。このメソッドを作るには、独自の method_missing を作成します。

https://gist.github.com/samholst/8713942b1c2a0636e265981c86fd33eb

Ruby には関数オブジェクトとみなされるオブジェクトがいくつかあり、特に Method と Proc オブジェクトがそうです。また、Ruby には、半関数オブジェクトと考えられるオブジェクトが 2 種類あります。UnboundMethod と block です。UnboundMethod は関数オブジェクトとして使う前に、まずオブジェクトに束縛されなければなりません(したがって Method になる)。ブロックは関数オブジェクトのように呼び出すことができますが、オブジェクトとして他の能力で使用する(例えば、引数として渡す)には、最初にProcに変換する必要があります。最近では、シンボル(単項演算子 : リテラルでアクセス)も Proc に変換できるようになりました。

https://en.wikipedia.org/wiki/Function_object

以前は noSuchMethod プロパティで、オブジェクトに存在しないメソッドが呼び出されたときに実行する関数を参照していましたが、この関数は廃止されました。
__noSuchMethod__は廃止されましたが、ECMAScript 2015の仕様ではProxyオブジェクトがあり、これを使うと以下のようなことが実現できます(他にもあります)。

https://cgi.cse.unsw.edu.au/~cs2041/doc/MDN_javascript_reference/Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod.html

そんでは実装の続きイ

とりあえずTextするメソッドを量産するものを作る
粒コードだと表現に限界があるので、モジュールで分けよう https://editor.p5js.org/setapolo/sketches/muWZ9Dw97

Pythonでは、動的な振る舞いをカスタマイズするためのメカニズムとして、特に「マジックメソッド」(特殊メソッドとも呼ばれます)を利用することができます。これらは、クラス内に定義されるダブルアンダースコア(__)で始まるメソッドで、Pythonのオブジェクトが様々な演算子に反応する方法をカスタマイズします。JavaScriptのプロキシやRubyのゴーストメソッドに類似していますが、使用法や目的が異なります。

Pythonの代表的なマジックメソッド

  • __getattr__, __getattribute__: オブジェクトの属性にアクセスされたときに呼ばれるメソッドです。__getattr__ は属性が見つからないときに呼ばれ、__getattribute__ は属性へのアクセスがあるたびに呼ばれます。

  • __setattr__, __delattr__: オブジェクトの属性が設定または削除されるときに呼ばれるメソッドです。

  • __call__: オブジェクトが関数として呼び出されたときに実行されるメソッドです。

お願い致します