ES6 Reflect

80 阅读2分钟
  • 操作对象

    • Object.defineProperty delete in等集中在Reflect的静态方法上

目的

  • Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上

  • Reflect对象上可以拿到语言内部的方法

    • 某些方法同时在ObjectReflect对象上部署

    • 未来的新方法将只部署在Reflect对象上

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

// 老写法
try {
  Object.defineProperty(target, property, attributes);
  // success
} catch (e) {
  // failure
}

// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}
  • 将命令式操作转变为函数调用,避免更多的保留字占用

    • name in objdelete obj[name],对应Reflect.has(obj, name)Reflect.deleteProperty(obj, name)
// 老写法
'assign' in Object // true

// 新写法
Reflect.has(Object, 'assign') // true
  • Reflect对象的方法与Proxy对象handler的方法是一一对应的

    • 想要调用默认行为,直接在Reflect上调用同名方法
let proxy = new Proxy({}, {
  set: function(target, name, value, receiver) {
    var success = Reflect.set(target, name, value, receiver);
    if (success) {
      console.log('property ' + name + ' on ' + target + ' set to ' + value);
    }
    return success;
  }
});

静态方法

  • Reflect.apply(target, thisArg, args)

  • Reflect.get(target, name, receiver)

  • Reflect.set(target, name, value, receiver)

  • Reflect.defineProperty(target, name, desc)

  • Reflect.deleteProperty(target, name)

  • Reflect.has(target, name)

  • Reflect.ownKeys(target)

  • Reflect.isExtensible(target)

  • Reflect.preventExtensions(target)

  • Reflect.getOwnPropertyDescriptor(target, name)

  • Reflect.getPrototypeOf(target)

  • Reflect.setPrototypeOf(target, prototype)

Reflect.construct(target, args)

  • 实例化一个对象

  • 用可变的参数来调用构造函数

var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
  • 比较:指定构造函数和原型对象(使用Object.create())来创建一个对象的
function OneClass() {
    this.name = 'one';
}

function OtherClass() {
    this.name = 'other';
}

// 创建一个对象:
var obj1 = Reflect.construct(OneClass, args, OtherClass);

// 与上述方法等效:
var obj2 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);

console.log(obj1.name); // 'one'
console.log(obj2.name); // 'one'

console.log(obj1 instanceof OneClass); // false
console.log(obj2 instanceof OneClass); // false

console.log(obj1 instanceof OtherClass); // true
console.log(obj2 instanceof OtherClass); // true
  • Object.create()Function.prototype.apply():如果不使用new操作符调用构造函数,构造函数内部的new.target值会指向undefined

  • Reflect.construct()来创建对象:new.target值会自动指定到target(或者 newTarget,前提是 newTarget 指定了)

function OneClass() {
    console.log('OneClass');
    console.log(new.target);
}
function OtherClass() {
    console.log('OtherClass');
    console.log(new.target);
}

var obj1 = Reflect.construct(OneClass, args);
// 输出:
//     OneClass
//     function OneClass { ... }

var obj2 = Reflect.construct(OneClass, args, OtherClass);
// 输出:
//     OneClass
//     function OtherClass { ... }

var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// 输出:
//     OneClass
//     undefined
  • 示例
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776

Reflect.construct() - JavaScript | MDN (mozilla.org)