Heim >Web-Frontend >js-Tutorial >Verwenden Sie PHP-ähnliche magische Methoden in JS

Verwenden Sie PHP-ähnliche magische Methoden in JS

Guanhui
Guanhuinach vorne
2020-05-23 10:39:242874Durchsuche

Verwenden Sie PHP-ähnliche magische Methoden in JS

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen