ES6基本的语法(九) @decortor 装饰器

@decortor 装饰器

装饰器的本质还是一种函数

修饰私有属性


class Fun {
    constructor(){
        this.keyValue = ''
    }
    @name
    myName = 'ccc';
}

function name(proto, key, descriptor){
    console.log(proto, key, descriptor)
    // console.log(原型, 属性, descriptor)
    // descriptor 和之前说的 Object.defineproperty 一样是描述符
    // 四个属性
    configurable // 配置
    enumerable  // 枚举
    writable    // 写入
    // 前面三个不做介绍

    initializer // 属性值 
    console.log(descriptor.initializer) // 输出 "ccc"
    
    // 修改 initializer
    descriptor.initializer = function(){
        return "xxx"
    }
}


var fun = new Fun() // 不 new 修饰器里面的方法都可以执行

console.log(fun.myName) // 输出 "xxx"

修饰原型上的属性


class Fun {
    constructor(){
        this.keyValue = ''
    }
    @myCount
    getCount(){
        console.log('发送请求')
    }

    @myBox
    box=()=>{
        console.log('发送请求')
    }
}

function myCount(proto, key, descriptor) {
    console.log(proto, key, descriptor)
    // console.log(原型, 属性, descriptor)
    // descriptor 和之前说的 Object.defineproperty 一样是描述符
    // 四个属性
    configurable // 配置
    enumerable  // 枚举
    writable    // 写入
    // 前面三个不做介绍

    value // 方法体
    console.log(descriptor.value) // 就是 getCount() 这个方法体
    
    // 修改 value
    descriptor.value = function(){
        console.log("666");
        console.log(this); // 输出的是 fun
    }
}

function box (){
    // 箭头函数的时候 
    console.log(proto, key, descriptor)
    // console.log(原型, 属性, descriptor)
    // descriptor 和之前说的 Object.defineproperty 一样是描述符
    // 四个属性
    configurable // 配置
    enumerable  // 枚举
    writable    // 写入
    // 前面三个不做介绍
    // 还是 initializer
    initializer // 属性值 
    
}

var fun = new Fun() 

console.log(fun.getCount()) // 输出 666

上面的代码中在装饰原型上面的方法的时候 initializer 会变成 value,会指向被装饰的方法体,可以通过去 descriptor.value=fun(){} 的方式去修改。

装饰类


@boxs
class box {
    constructor (){
        console.log("我是constructor")
    }
}

function boxs (target) {
    target.name = "ccc" // 可以这样子直接加属性
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ES6 Class 和 ES5 的对比和基本说明 上面的代码中定义了一个“类” 类名是 Point。constru...
    StevenTang阅读 229评论 0 0
  • 目录 简介 静态方法 实例属性的新写法 静态属性 私有方法和私有属性 new.target属性 一、简介 类的由来...
    HalShaw阅读 727评论 0 0
  • 发展历史 一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? 要讲清楚这个问题,需...
    FlyElephant阅读 4,011评论 0 5
  • Class 的基本语法 简介 JavaScript 语言中,生成实例对象的传统方法是通过构造函数。下面是一个例子。...
    huilegezai阅读 534评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,557评论 16 22