• Reflect对象


    Reflect对象

    Reflect对象的出现主要有以下几点原因: 

      1. 将Object 对象上的属于语言内部的方法放到 Reflect 对象上,从 Reflect 上获得语言内部的方法  

    // let obj = { color: 'red' }
    // // Object.preventExtensions(obj); 
    // Reflect.preventExtensions(obj);
    // obj.num = 100;
    // console.log(obj)
    

    2 修改某些 Object 方法的返回结果,让其变得更合理。

    // let obj = {};
    // // 特性
    // // Object.defineProperty(obj, 'color', { value: 'red', configurable: false });
    // // console.log(Object.defineProperty(obj, 'color', { value: 'green', configurable: true }))
    // console.log(Reflect.defineProperty(obj, 'color', { value: 'green', configurable: true }))
    // console.log(1111)
    

    3 让Object的操作都变成函数行为。

    // let obj = { color: 'red' };
    // console.log('color' in obj)
    // console.log(Reflect.has(obj, 'color'))
    // 删除属性
    // delete obj.color;
    // console.log(Reflect.deleteProperty(obj, 'color'))
    // console.log(obj)
    

    4 Reflect 对象的方法与 Proxy 对象的方法一一对应。

    // // 无拦截
    // let obj = {}
    // // let proxy = new Proxy(obj, {})
    // // 等价方式
    // let proxy = new Proxy(obj, {
    //     // 取值
    //     get(...args) {
    //         return Reflect.get(...args)
    //     },
    //     // 赋值
    //     set(...args) {
    //         return Reflect.set(...args)
    //     }
    // })
    // proxy.color = 'red';
    // console.log(obj)
    // 对象
    let obj = {
        color: 'red',
        set num(val) {
            console.log(111, this, this.num, val)
            this._num = val + this.num;
        },
        get num() {
            return this._num;
        }
    }
    // // obj.num = 5;
    // // 运行环境,提供num数据
    let ickt = { num: 10 }
    // // 通过refluct提供这样的环境
    Reflect.set(obj, 'num', 5, ickt);
    console.log(obj.num, obj)
    // 代理
    // let proxy = new Proxy(obj, {
    //     num: 20,
    //     // 赋值
    //     set(target, key, value, receiver) {
    //         // console.log('set', this, target, key, value, receiver)
    //         // target[key] = value;
    //         return Reflect.set(target, key, value, this)
    //     },
    //     // 取值方法
    //     get(target, key, receiver) {
    //         // return target[key]
    //         return Reflect.get(target, key, this)
    //     }
    // })
    // proxy.num = 5;
    // console.log(proxy, proxy.num)
    // console.log(obj)

    电脑刺绣绣花厂 http://www.szhdn.com 广州品牌设计公司https://www.houdianzi.com

    Reflect静态方法

    Reflect.get(target,Key,receiver)
    Reflect.set(target,key,value,receiver)
    Reflect.apply(target,content,args)
    
    // 获取div
    let divs = document.getElementsByTagName('div');
    // 遍历
    // divs.forEach()
    Array.prototype.forEach.call(divs, item => console.log(item))
    // 通过Reflect遍历
    Reflect.apply(Array.prototype.forEach, divs, [item => console.log(item)])
    
    Reflect.construct(target,args)
    
    // 类
    // class Demo {
    //     constructor(color) {
    //         this.color = color;
    //     }
    // }
    // // 创建对象
    // console.log(new Demo('red'))
    // // 通过Reflect创建
    // console.log(Reflect.construct(Demo, ['red']))
    
    Reflect.defineProperty(target,key)
    Reflect.deleteProperty(target,key)
    Reflect.has(target,key)
    Reflect.ownKeys(target)
    Reflect.preventExtensions(target)
    Reflect.isExtensible(target)
    Reflect.getOwnPropertyDescriptor(target,key)
    Reflect.getPrototypeOf(target)
    Reflect.setPrototypeOf(target,proto)
  • 相关阅读:
    DataGridView 密码列(显示为*号)的设置
    有關界面化學的一些有趣現象
    电商网站需要ICP证吗
    JS 未结束的字符串常量
    Iframe自适应高度
    JS正则表达式
    界面活性劑的作用
    js转义字符
    解决dbo登录名为空的问题
    肌肤弹性胶原蛋白
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13821579.html
Copyright © 2020-2023  润新知