Maison interface Web Questions et réponses frontales Comment comprendre les décorateurs es6

Comment comprendre les décorateurs es6

Jan 03, 2023 pm 04:14 PM
es6 装饰器

Dans es6, le modèle de décorateur est une théorie de conception qui étend dynamiquement les fonctions d'un objet sans changer la classe d'origine et en utilisant l'héritage ; l'essence du décorateur est une fonction ordinaire utilisée pour étendre les attributs de classe et la méthode des classes. Avantages de l'utilisation de décorateurs : 1. Le code devient plus lisible et le nom du décorateur est équivalent à un commentaire 2. Les fonctions d'origine peuvent être étendues sans modifier le code d'origine ;

Comment comprendre les décorateurs es6

L'environnement d'exploitation de ce tutoriel : système Windows 7, ECMAScript version 6, ordinateur Dell G3.

Comment comprendre Decorator dans ES6 ?

Decorator, dont le nom nous rappelle facilement le modèle de décorateur

En termes simples, le modèle de décorateur est un moyen d'étendre dynamiquement un objet sans changer la classe d'origine et en utilisant la théorie de la conception fonctionnelle.

Il en va de même pour la fonction Décorateur dans ES6. Son essence n'est pas une structure haut de gamme, c'est juste une fonction ordinaire utilisée pour étendre les attributs de classe et les méthodes de classe

Un soldat est défini ici, et il n'a aucun équipement. à ce moment

class soldier{ 
}
Copier après la connexion

Définir une fonction pour obtenir l'équipement AK, c'est-à-dire le décorateur

function strong(target){
    target.AK = true
}
Copier après la connexion

Utiliser le décorateur pour améliorer le soldat

@strong
class soldier{
}
Copier après la connexion

Le soldat a maintenant une arme

soldier.AK // true
Copier après la connexion

Bien que le code ci-dessus soit simple, vous pouvez voir clairement l'utilisation de Decorator (décoration) Deux avantages majeurs :

  • Le code devient plus lisible, et le nom du décorateur équivaut à un commentaire

  • Agrandir la fonction d'origine sans changer le code d'origine

Décoration L'utilisation de l'outil

Docorator Les objets modifiés sont les deux types suivants:

  • Décoration de classe

  • Décoration d'attribut de classe

Décoration de classe

Lors de la décoration de la classe elle-même, il peut accepter un paramètre, c'est-à-dire la classe elle-même

Décomposez le comportement du décorateur, et tout le monde peut avoir une compréhension plus profonde

@decorator
class A {}

// 等同于

class A {}
A = decorator(A) || A;
Copier après la connexion

Ce qui suit@testable est un décorateur, et la cible est la classe entrante, qui est MyTestableClass, qui implémente l'ajout à la classe Attributs statiques

@testable
class MyTestableClass {
  // ...
}

function testable(target) {
  target.isTestable = true;
}

MyTestableClass.isTestable // true
Copier après la connexion

Si vous souhaitez transmettre des paramètres, vous pouvez encapsuler une couche de fonctions en dehors du décorateur

function testable(isTestable) {
  return function(target) {
    target.isTestable = isTestable;
  }
}

@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true

@testable(false)
class MyClass {}
MyClass.isTestable // false
Copier après la connexion

Décoration des attributs de classe

Lors de la décoration des attributs de classe, vous pouvez accepter trois paramètres :

  • L'objet prototype de la classe

  • Le nom de l'attribut qui doit être décoré

  • L'objet de description du nom de l'attribut décoré

Définissez d'abord un décorateur en lecture seule

function readonly(target, name, descriptor){
  descriptor.writable = false; // 将可写属性设为false
  return descriptor;
}
Copier après la connexion

Utilisez la lecture seule pour décorer la méthode du nom de la classe

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}
Copier après la connexion

C'est équivalent à L'appel suivant

readonly(Person.prototype, 'name', descriptor);
Copier après la connexion

Si une méthode a plusieurs décorateurs, tout comme un oignon, elle entre d'abord de l'extérieur vers l'intérieur, puis s'exécute de l'intérieur vers l'extérieur

function dec(id){
    console.log('evaluated', id);
    return (target, property, descriptor) =>console.log('executed', id);
}

class Example {
    @dec(1)
    @dec(2)
    method(){}
}
// evaluated 1
// evaluated 2
// executed 2
// executed 1
Copier après la connexion

Le décorateur externe @dec(1) entre en premier, mais la couche interne Le décorateur @dec(2) est exécuté en premier

Remarque

Le décorateur ne peut pas être utilisé pour décorer des fonctions, car la fonction a des déclarations de variables

var counter = 0;

var add = function () {
  counter++;
};

@add
function foo() {
}
Copier après la connexion

Dans la phase de compilation, cela devient ce qui suit

var counter;
var add;

@add
function foo() {
}

counter = 0;

add = function () {
  counter++;
};
Copier après la connexion

L'intention est de contrer après exécution Égal à 1, mais le résultat réel est que le compteur est égal à 0

Scénarios d'utilisation du décorateur

Basé sur le rôle puissant de Decorator, nous pouvons répondre aux besoins de divers scénarios. En voici quelques-uns simples :

Utilisez React - Lorsque vous utilisez Redux, si vous l'écrivez sous la forme suivante, c'est à la fois inesthétique et gênant

class MyReactComponent extends React.Component {}

export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);
Copier après la connexion

Cela devient beaucoup plus simple grâce aux décorateurs

@connect(mapStateToProps, mapDispatchToProps)
export default class MyReactComponent extends React.Component {}
Copier après la connexion

Les mixins peuvent également être écrits en tant que décorateurs, ce qui rend leur utilisation plus concise

function mixins(...list) {
  return function (target) {
    Object.assign(target.prototype, ...list);
  };
}

// 使用
const Foo = {
  foo() { console.log('foo') }
};

@mixins(Foo)
class MyClass {}

let obj = new MyClass();
obj.foo() // "foo"
Copier après la connexion

Parlons de plusieurs décorateurs courants dans core-decorators.js

@antobind

le décorateur autobind crée cet objet dans la méthode, lier l'objet d'origine

@readonly

le décorateur en lecture seule rend la propriété ou la méthode n'est pas accessible en écriture

import { autobind } from 'core-decorators';

class Person {
  @autobind
  getPerson() {
    return this;
  }
}

let person = new Person();
let getPerson = person.getPerson;

getPerson() === person;
// true
Copier après la connexion

@deprecate

Le décorateur obsolète ou obsolète affiche un avertissement dans la console indiquant que la méthode sera obsolète

import { readonly } from 'core-decorators';

class Meal {
  @readonly
  entree = 'steak';
}

var dinner = new Meal();
dinner.entree = 'salmon';
// Cannot assign to read only property 'entree' of [object Object]
Copier après la connexion
[Recommandations associées :

tutoriel vidéo javascript, front-end web]

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment inverser un tableau dans ES6 Comment inverser un tableau dans ES6 Oct 26, 2022 pm 06:19 PM

Dans ES6, vous pouvez utiliser la méthode reverse() de l'objet tableau pour inverser le tableau. Cette méthode est utilisée pour inverser l'ordre des éléments du tableau, en plaçant le dernier élément en premier et le premier élément en dernier. .inverse()". La méthode reverse() modifiera le tableau d'origine. Si vous ne souhaitez pas le modifier, vous devez l'utiliser avec l'opérateur d'expansion "...", et la syntaxe est "[...array].reverse(). ".

L'async est-il pour es6 ou es7 ? L'async est-il pour es6 ou es7 ? Jan 29, 2023 pm 05:36 PM

async est es7. async et wait sont de nouveaux ajouts à ES7 et sont des solutions pour les opérations asynchrones ; async/await peut être considéré comme un sucre syntaxique pour les modules co et les fonctions de générateur, résolvant le code asynchrone js avec une sémantique plus claire. Comme son nom l'indique, async signifie « asynchrone ». Async est utilisé pour déclarer qu'une fonction est asynchrone ; il existe une règle stricte entre async et wait. Les deux sont inséparables l'un de l'autre et wait ne peut être écrit que dans des fonctions asynchrones.

Pourquoi le mini-programme doit-il convertir es6 en es5 ? Pourquoi le mini-programme doit-il convertir es6 en es5 ? Nov 21, 2022 pm 06:15 PM

Pour la compatibilité du navigateur. En tant que nouvelle spécification pour JS, ES6 ajoute de nombreuses nouvelles syntaxes et API. Cependant, les navigateurs modernes ne prennent pas en charge les nouvelles fonctionnalités d'ES6, le code ES6 doit donc être converti en code ES5. Dans les outils de développement Web WeChat, babel est utilisé par défaut pour convertir le code de syntaxe ES6 du développeur en code ES5 bien pris en charge par les trois terminaux, aidant les développeurs à résoudre les problèmes de développement causés par différents environnements uniquement dans le projet. Il suffit de configurer et de vérifier le ; Option "ES6 à ES5".

Comment trouver différents éléments dans deux tableaux dans Es6 Comment trouver différents éléments dans deux tableaux dans Es6 Nov 01, 2022 pm 06:07 PM

Étapes : 1. Convertissez respectivement les deux tableaux en types d'ensemble, avec la syntaxe "newA=new Set(a); newB=new Set(b);" 2. Utilisez has() et filter() pour trouver l'ensemble de différences. , avec la syntaxe " new Set([...newA].filter(x =>!newB.has(x)))", les éléments de l'ensemble de différences seront inclus dans une collection d'ensembles et renvoyés 3. Utilisez Array. from pour convertir l'ensemble en tableau Tapez, syntaxe "Array.from(collection)".

Comment implémenter la déduplication de tableau dans es5 et es6 Comment implémenter la déduplication de tableau dans es5 et es6 Jan 16, 2023 pm 05:09 PM

Dans es5, vous pouvez utiliser l'instruction for et la fonction indexOf() pour réaliser la déduplication de tableau. La syntaxe "for(i=0;i<array length;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}". Dans es6, vous pouvez utiliser l'opérateur spread, Array.from() et Set pour supprimer la duplication ; vous devez d'abord convertir le tableau en un objet Set pour supprimer la duplication, puis utiliser l'opérateur spread ou la fonction Array.from(). pour reconvertir l'objet Set en un groupe Just.

Comment fonctionnent les décorateurs et les gestionnaires de contexte en Python ? Comment fonctionnent les décorateurs et les gestionnaires de contexte en Python ? Oct 20, 2023 pm 07:04 PM

Comment fonctionnent les décorateurs et les gestionnaires de contexte en Python ? En Python, les décorateurs et les gestionnaires de contexte sont deux concepts et fonctionnalités très utiles. Ils sont tous conçus pour simplifier le code, augmenter la lisibilité du code et faciliter la réutilisation du code. 1. Décorateur Un décorateur est une fonction spéciale en Python utilisée pour modifier le comportement d'une fonction. Cela nous permet d'envelopper ou d'étendre la fonction d'origine sans la modifier. Les décorateurs sont largement utilisés dans de nombreux frameworks et bibliothèques Python, tels que Flask, Dj

Apprenez étape par étape à utiliser les décorateurs pour étendre les minuteries Python. Apprenez étape par étape à utiliser les décorateurs pour étendre les minuteries Python. Apr 13, 2023 pm 08:46 PM

Ceci est notre troisième article pour vous apprendre étape par étape comment implémenter un timer Python. Les deux premiers articles : vous apprennent étape par étape comment implémenter un timer Python et utiliser des gestionnaires de contexte pour étendre les timers Python, rendant notre classe Timer pratique à utiliser, belle et pratique. Mais cela ne nous satisfait pas, il existe encore un cas d’usage qui peut encore le simplifier. Supposons que nous devions suivre le temps passé dans une fonction donnée dans notre base de code. Avec un gestionnaire de contexte, vous avez essentiellement deux options différentes : 1. Utiliser ​Timer chaque fois que vous appelez une fonction : with Timer("some_name") : do_something() Quand nous sommes dans

Que signifie la zone morte temporaire es6 ? Que signifie la zone morte temporaire es6 ? Jan 03, 2023 pm 03:56 PM

Dans es6, la zone morte temporaire est une erreur de syntaxe, qui fait référence aux commandes let et const qui font que le bloc forme une portée fermée. Dans un bloc de code, avant qu'une variable ne soit déclarée à l'aide de la commande let/const, la variable est indisponible et appartient à la « zone morte » de la variable avant que la variable ne soit déclarée ; c'est ce qu'on appelle syntaxiquement une « zone morte temporaire ». ES6 stipule que la promotion des variables ne se produit pas dans les zones mortes temporaires et dans les instructions let et const, principalement pour réduire les erreurs d'exécution et empêcher l'utilisation de la variable avant qu'elle ne soit déclarée, ce qui peut entraîner un comportement inattendu.

See all articles