JavaScript マジック メソッド
このスクリプトは、プロキシを使用して、PHP のマジック メソッドと同様のマジック メソッドを JavaScript で実装します。
例
次のように使用できます:
const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (name) { return `[[${name}]]` } }) const foo = new Foo foo.bar // "Bar" foo.baz // "[[baz]]"
Babel などの JavaScript コンパイラを使用していて、デコレータが有効になっている場合は、次のようにすることもできます。デコレータとして magicMethods 関数を使用します。
@magicMethods class Foo { // ... }
サポート マジック メソッド
クラス Class とインスタンスを指定すると、このスクリプトでサポートされるマジック メソッドは次のとおりです:
__get(name)
instance[name] にアクセスしようとしたときに呼び出されます。name はインスタンスの属性ではありません。
注: PHP では、名前がインスタンスに存在するかどうかを確認するときに、カスタム __isset() メソッドは使用されません。
__set(name, value)
このメソッドは、instance[name] = ... を使用しようとしたときに呼び出されますが、instance は name 属性を設定しません。
__isset(name)
このメソッドは、インスタンス内で name を呼び出して name が存在するかどうかを確認しようとするときに呼び出されます。
__unset(name)
このメソッドは、インスタンス[name]の削除によって name 属性の設定を解除しようとするときに呼び出されます。
その他のメソッド
次のマジック メソッドはこのスクリプトでサポートされていますが、PHP ではサポートされていません:
static __getStatic(name)
__get() に似ていますが、インスタンスの代わりにクラスで使用されます。
static __setStatic(name, value)
__set() に似ていますが、代わりにクラスで使用されます。インスタンスの。
マジック メソッド X がサポートされていないのはなぜですか?
これらは不要か非実用的です:
__construct() いいえ、JavaScript にはすでにコンストラクターがあります。
__destruct(): JavaScript にはオブジェクトを破棄するためのフック メカニズムがありません。
__call(): PHP とは異なり、メソッドは JavaScript のプロパティのようなもので、最初に __get() を介して取得されます。 __call() を実装するには、単に get() から関数を返すだけです。
__callStatic(): __call() に似ていますが、__getStatic() を使用します。
__sleep()、__wakeup(): JavaScript にはシリアル化と逆シリアル化が組み込まれていません。 JSON.stringify() と JSON.parse() を使用できますが、これらにはメソッドを自動的にトリガーするメカニズムがありません。
__toString() JavaScript の toString()
__invoke() に相当するものがすでに存在します。関数以外のオブジェクトを呼び出そうとすると、JavaScript はエラーをスローしますが、これは避けられません。
__set_state(): JavaScript には var_export() に相当するものはありません。
__clone(): JavaScript の組み込みクローン機能用のフック。
__debugInfo(): console.log() 出力にフックできません。
マジック メソッドを使用してクラスを拡張できますか?
ある程度は可能です:
class Bar extends Foo {} // 或者,如果类 Bar 本身包含魔术方法: const Bar = magicMethods(class Bar extends Foo { // ... })
ただし、残念ながら、サブクラスから親クラスのプロパティにアクセスすることはできません:
const Foo = magicMethods(class Foo { __get() { return this.bar() } }) class Bar extends Foo { bar() { return 'value' } } // 这个 *不会* 调用 B 的 bar() 方法,而是抛出一个类型错误: (new Bar).something
推奨チュートリアル: "JS チュートリアル "
以上がJS で PHP のようなマジック メソッドを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。