Maison  >  Article  >  interface Web  >  Utilisez des méthodes magiques de type PHP dans JS

Utilisez des méthodes magiques de type PHP dans JS

Guanhui
Guanhuiavant
2020-05-23 10:39:242796parcourir

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:JS Zepto jQuery pour mobileArticle suivant:JS Zepto jQuery pour mobile