首页 > 其他分享 >装饰器

装饰器

时间:2022-10-05 15:12:31浏览次数:45  
标签:function fun1 target 装饰 Person class log

装饰器就是一个方法,可以注入到,类、方法、属性参数上来扩展他们的功能

类装饰器(无法传参)

(function () {
  function fun1(target: any): void {
    target.prototype.name = "张三";
    target.class = "humen";
  }

  @fun1
  class Person {}
  const p = new Person();
  //@ts-ignore
  console.log(p.name);
  //@ts-ignore
  console.log(Person.class);
})();

// 和下面代码等价

(function () {
  function fun1(target: any): void {
    target.prototype.name = "张三";
    target.class = "humen";
  }
  class Person {}
  fun1(Person);
  const p = new Person();
  //@ts-ignore
  console.log(p.name);
  //@ts-ignore
  console.log(Person.class);
})();

装饰器工厂,解决类装饰器不能传参的问题

(function () {
  function fun1(option: Record<string, any>) {
    return function (target: any) {
      target.prototype.name = option.name;
      target.class = option.class;
    };
  }

  @fun1({
    name: "张三",
    class: "humen",
  })
  class Person {}
  const p = new Person();
  //@ts-ignore
  console.log(p.name);
  //@ts-ignore
  console.log(Person.class);
})();

// 和下面代码等价

(function () {
  /**
   * @fun1() 执行,返回的就是其内部得函数,其后面结果和类装饰器就是一样的
   */
})();

装饰器组合(装饰器从下到上执行)

(function () {
  function fun1(target: any) {
    target.fun1 = "ok";
  }

  function fun2(option: any) {
    return function (target: any) {
      target.fun2 = option.ok;
    };
  }

  @fun1
  @fun2({ ok: "ok" })
  class Person {}

  // fun2装饰后,再把结果交给fun1装饰

  //@ts-ignore
  console.log(Person.fun1)
  //@ts-ignore
  console.log(Person.fun2)
})();

属性装饰器

(function () {
  function fun(target: any, functionName: string) {
    
    // target类本身(Person)
    // functionName被装饰的方法名字(sayName)
    
    console.log(target, functionName);
  }

  class Person {
    @fun
    sayName() {
      console.log("my name is llc");
    }
  }

  const p = new Person()
  p.sayName()
})();

标签:function,fun1,target,装饰,Person,class,log
From: https://www.cnblogs.com/Lilc20201212/p/16755601.html

相关文章

  • JAVA设计模式-装饰模式
    JAVA设计模式-装饰模式介绍装饰模式是一种结构型模式,在不改变现有对象结构的前提下,给现有对象添加新的功能,动态增加职责,是现有类的一个包装。角色Component:定义一......
  • python装饰器进阶指南
    前言最近一有时间就在整理自己常用的代码片段,并做成了私人pip包,正好整理到了装饰器的部分,所以就想着写篇文章来总结一下。写这篇文章的目的是为了让大家对装饰器有一个更......
  • Django中六个常用的自定义装饰器
    Django中六个常用的自定义装饰器 目录装饰器作用Django装饰器GroupRequiredAnonymousrequiredSuperuserrequiredAjaxrequiredTimeit自定义功能......
  • 【设计模式】29.结构型模式-装饰模式(Decorator)
    一、描述装饰模式能够在不改变原来对象结构和功能的前提下,动态的给对象增加新的功能,相比于使用子类扩展的方式,装饰模式更加的灵活。角色(1)抽象构件类:为具体构件类和装饰......
  • Java中装饰者模式
    装饰模式可以在不改变原来类中代码的基础上,增强类中的方法装饰类LDHWrapper和被装饰类LDH必须实现同个接口Star装饰类中要定义属性为:被装饰类对象,同时定义构造方法重写......
  • 初识设计模式 - 装饰器模式
    简介装饰器模式主要解决的问题是,如果使用子类继承的方式扩展一个类,随着扩展功能的增多,子类会非常膨胀,包括子类的数量或子类的方法数。装饰器模式其核心还是“用组合替代......
  • 如何将有参数装饰器的括号去掉,当成无参数装饰器使用
    importtimedefdelayed_start(func=None,*,duration=1):#这一层主要是装饰器参数defdecorator(_func):#这一层主要是将被装饰器装饰的函数传递进来......
  • Python基础(八) | 深浅拷贝、生成器、迭代器以及装饰器详解
    ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深......
  • python-装饰器
    装饰器(1)什么是装饰器:器指的是工具,可以定义成函数装饰指的是为其他事务添加额外的东西来点缀上面两者合到一起:装饰器指的是定义一个函数,该函数用来为其他函数添......
  • 装饰器基础二装饰类的装饰器
    类可以做装饰器,也可以被装饰器装饰,被装饰器装饰,那这个装饰器可以接收一个类,返回一个类1、装饰类的装饰器-输入类返回类defadd_str(cls):def__str__(self):......