13Reflect

作者: 我_巨可爱 | 来源:发表于2017-10-30 17:01 被阅读0次

    概述

    Reflect 对象是为了操作对象而提供的新API

    有以下特征

    1. Object对象上明显属于语言内部的方法,放到Reflect对象上
    2. 修改某些返回结果,更加合理
    • Object.defineProperty(obj,name,desc)当无法定义属性时报错
    • Reflect.defineProperty(obj,name,des)当无法定义属性时返回false
    1. Object 的操作都变成函数
    • name in obj 转变成 Reflect.has(obj,name)
    • delete obj[name] 转变成 Reflect.deleteProperty(obj,name)
    1. Reflect 对象的方法和 Proxy 上意义对应,不管 Proxy 怎么修改默认行为,总可以在 Reflect 上获取默认行为
    // 获取默认行为
    var myObj = {
        foo: 1,
        // 默认行为
        set bar (value) {
            return this.foo = value;
        }
    }
    
    var proxy = new Proxy(myObj,{
        // 修改默认行为
        set: function (target,key,value,receiver) {
            return target.foo = value + 1;
        }
    });
    // set
    proxy.foo = 5;  // 使用代理上的方法,myObj 上属性进行相应的改变
    Reflect.set(myObj,foo,5); // 使用对象上的set方法
    console.log(myObj.foo);
    

    基础案例

    receiver 方法一般指的是该方法内的this指向

    var myObject = {
        foo: 4,
        set bar(value) {
            return this.foo = value;
        }
    };
    var myReceiverObject = {
        foo: 0
    }
    Reflect.set(myObject,'bar',1,myReceiverObject);
    myObject.foo //4
    myReceiverObject.foo //1
    

    各种方法

    1. Reflect.apply(target,thisArg,args)
    2. Reflect.construct(target,args)
    3. Reflect.get(target,name,receiver)
    4. Reflect.set(target,name,value,receiver)
    5. Reflect.defineProperty(target,name,desc)
    6. Reflect.deleteProperty(target,name)
    7. Reflect.has(target,name)
    8. Reflect.ownKeys(target)
    9. Reflect.isExtensible(target)
    10. Reflect.preventExtensions(target)
    11. Reflect.getOwnPropertyDescriptor(target, name)
    12. Reflect.getPrototypeOf(target)
    13. Reflect.setPrototypeOf(target, prototype)

    相关文章

      网友评论

          本文标题:13Reflect

          本文链接:https://www.haomeiwen.com/subject/ducmpxtx.html