JavaScript Magic Method
Dieses Skript verwendet Proxy, um magische Methoden in JavaScript zu implementieren, die denen in PHP ähneln.
Beispiel
Sie können es so verwenden:
const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (name) { return `[[${name}]]` } }) const foo = new Foo foo.bar // "Bar" foo.baz // "[[baz]]"
Wenn Sie einen JavaScript-Compiler wie Babel verwenden und Dekoratoren aktiviert haben, können Sie dies auch tun Verwenden Sie die magicMethods-Funktion als Dekorator:
@magicMethods class Foo { // ... }
Unterstützt magische Methoden
Bei einer gegebenen Klasse Klasse und Instanz sind die folgenden magischen Methoden von diesem Skript unterstützt:
__get(name)
Wird aufgerufen, wenn versucht wird, auf Instanz[Name] zuzugreifen und Name kein Attribut in der Instanz ist.
Hinweis: In PHP wird für die Prüfung, ob name in einer Instanz vorhanden ist, keine benutzerdefinierte __isset()-Methode verwendet.
__set(name, value)
Diese Methode wird aufgerufen, wenn versucht wird, „instance[name] = ...“ zu verwenden, und „instance“ das Namensattribut nicht festlegt.
__isset(name)
Diese Methode wird aufgerufen, wenn versucht wird, durch Aufrufen von name in einer Instanz zu überprüfen, ob name vorhanden ist.
__unset(name)
Diese Methode wird aufgerufen, wenn versucht wird, das Namensattribut durch Löschen von Instanz[Name] zu deaktivieren.
Andere Methoden
Die folgenden magischen Methoden werden durch dieses Skript unterstützt, aber nicht in PHP:
static __getStatic(name)
Ähnlich wie __get(), wird jedoch in Class statt in der Instanz verwendet.
static __setStatic(name, value)
Ähnlich wie __set(), wird jedoch stattdessen in Class verwendet zum Beispiel.
Warum wird Magic Method X nicht unterstützt?
Sie sind entweder unnötig oder unpraktisch:
__construct() Keine Notwendigkeit, JavaScript hat bereits einen Konstruktor.
__destruct(): Es gibt keinen Hook-Mechanismus für die Objektzerstörung in JavaScript.
__call(): Im Gegensatz zu PHP sind Methoden wie Eigenschaften in JavaScript und werden zunächst über __get() abgerufen. Um __call() zu implementieren, geben Sie einfach eine Funktion von get() zurück.
__callStatic(): Ähnlich wie __call(), aber mit __getStatic().
__sleep(), __wakeup(): JavaScript verfügt nicht über eine integrierte Serialisierung und Deserialisierung. Sie können JSON.stringify() und JSON.parse() verwenden, diese verfügen jedoch nicht über einen Mechanismus zum automatischen Auslösen von Methoden.
__toString() hat seit langem ein Gegenstück zu JavaScripts toString()
__invoke(): Wenn Sie versuchen, ein Nicht-Funktionsobjekt aufzurufen, gibt JavaScript einen Fehler aus, was unvermeidbar ist.
__set_state(): Es gibt kein Äquivalent zu var_export() in JavaScript.
__clone(): Ein Hook für die integrierte Klonfunktion in JavaScript.
__debugInfo(): Verbindung zur Ausgabe von console.log() nicht möglich.
Kann ich eine Klasse mit magischen Methoden erweitern?
Ja, bis zu einem gewissen Grad:
class Bar extends Foo {} // 或者,如果类 Bar 本身包含魔术方法: const Bar = magicMethods(class Bar extends Foo { // ... })
Aber leider können Sie von der untergeordneten Klasse aus nicht auf Eigenschaften in der übergeordneten Klasse zugreifen:
const Foo = magicMethods(class Foo { __get() { return this.bar() } }) class Bar extends Foo { bar() { return 'value' } } // 这个 *不会* 调用 B 的 bar() 方法,而是抛出一个类型错误: (new Bar).something
Empfohlenes Tutorial: "JS-Tutorial"
Das obige ist der detaillierte Inhalt vonVerwenden Sie PHP-ähnliche magische Methoden in JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!