Maison > Article > interface Web > Utilisez des méthodes magiques de type PHP dans JS
Méthode magique JavaScript
Ce script utilise Proxy pour implémenter des méthodes magiques en JavaScript similaires à celles de PHP.
Exemple
Vous pouvez l'utiliser comme ceci :
const Foo = magicMethods(class Foo { constructor () { this.bar = 'Bar' } __get (name) { return `[[${name}]]` } }) const foo = new Foo foo.bar // "Bar" foo.baz // "[[baz]]"
Si vous utilisez un compilateur JavaScript comme Babel et que les décorateurs sont activés, vous pouvez également utilisez la fonction magicMethods comme décorateur :
@magicMethods class Foo { // ... }
Prise en charge des méthodes magiques
Étant donné une classe et une instance, voici les méthodes magiques prises en charge par ce script :
__get(name)
Appelé lors de la tentative d'accès à l'instance[name] et le nom n'est pas un attribut dans l'instance.
Remarque : En PHP, vérifier si le nom existe dans une instance n'utilise aucune méthode __isset() personnalisée.
__set(name, value)
Cette méthode est appelée lorsque vous essayez d'utiliser instance[name] = ... et l'instance ne définit pas l'attribut name.
__isset(name)
Cette méthode est appelée lorsque vous essayez de vérifier si name existe en appelant name par instance.
__unset(name)
Cette méthode est appelée lorsque vous essayez de supprimer l'attribut name via delete instance[name].
Autres méthodes
Les méthodes magiques suivantes sont prises en charge via ce script, mais ne sont pas prises en charge en PHP :
static __getStatic(name)
Similaire à __get(), mais il est utilisé dans Class au lieu d'une instance.
static __setStatic(name, value)
Similaire à __set(), mais utilisé à la place dans Class par exemple.
Pourquoi la méthode magique X n'est-elle pas prise en charge ?
Ils sont soit inutiles, soit peu pratiques :
__construct() Pas besoin, JavaScript a déjà un constructeur.
__destruct() : Il n'existe pas de mécanisme de hook pour la destruction d'objets en JavaScript.
__call() : Contrairement à PHP, les méthodes sont comme des propriétés en JavaScript et sont d'abord obtenues via __get(). Pour implémenter __call(), vous renvoyez simplement une fonction de get().
__callStatic() : similaire à __call(), mais avec __getStatic().
__sleep(), __wakeup() : JavaScript n'a pas de sérialisation et de désérialisation intégrées. Vous pouvez utiliser JSON.stringify() et JSON.parse(), mais ils ne disposent d'aucun mécanisme pour déclencher automatiquement des méthodes.
__toString() a depuis longtemps un équivalent à toString() de JavaScript
__invoke() : si vous essayez d'appeler un objet non fonctionnel, JavaScript générera une erreur, ce qui est inévitable.
__set_state() : Il n'y a pas d'équivalent à var_export() en JavaScript.
__clone() : Un hook pour la fonction de clonage intégrée en JavaScript.
__debugInfo() : Impossible de se connecter à la sortie console.log().
Puis-je prolonger un cours en utilisant des méthodes magiques ?
Oui, dans une certaine mesure :
class Bar extends Foo {} // 或者,如果类 Bar 本身包含魔术方法: const Bar = magicMethods(class Bar extends Foo { // ... })
Mais malheureusement, vous ne pouvez pas accéder aux propriétés de la classe parent depuis la classe enfant :
const Foo = magicMethods(class Foo { __get() { return this.bar() } }) class Bar extends Foo { bar() { return 'value' } } // 这个 *不会* 调用 B 的 bar() 方法,而是抛出一个类型错误: (new Bar).something
Tutoriel recommandé : "Tutoriel JS"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!