JS で PHP のようなマジック メソッドを使用する

Guanhui
リリース: 2020-05-23 10:39:24
転載
2804 人が閲覧しました

JS で PHP のようなマジック メソッドを使用する

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート