1. 程式人生 > >《es6標準入門》知識整理(4)- Reflect

《es6標準入門》知識整理(4)- Reflect

昨天,我做了 es6 中的新物件 Proxy 的相關的知識整理,現在我會整理一下 es6 中另外一個新的內建物件:Reflect。

Reflect 是一個在超程式設計中使用大量靜態方法的全域性物件。

跟著我一起來了解一下吧。

Reflect.get() 和 Reflect.set() 可以操作一個物件的屬性。

    const Jing = {
    	sex: 'female',
    	age: '22'
    };
    console.log(Reflect.get(Jing, 'sex'));// 'female'
    console.log(Reflect.set(Jing, 'age','21'));
    console.log(Reflect.get(Jing,'age'))// '21'

Reflect 還提供還提供了一種不使用 new,而是用 Refelct.construct 來呼叫建構函式的方法。如

    function Employee(name) {
    	this.name = name;
    }
    const huang = new Employee('yuanyuan');
    console.log(huang.name)// yuanyuan
    const zhang = Reflect.construct(Employee, ['zhenzhen']);
    console.log(zhang.name);// zhenzhen

由上述例子可見,new target () 和 Reflcet.construct(target) 是等同的。

除此之外 Reflect 的方法和一些靜態物件的方法是一樣的,也就是說,從 Reflect 物件上可以拿到語言內部的方法,比如 getPrototypeOf:

    function Employee(name) {
    	this.name = name;
    }
    const huang = new Employee('yuanzhen');
    console.log(Object.getPrototypeOf(huang));// Employee
    console.log(Reflect.getPrototypeof(huang));// Employee

可知, Reflect.getPrototypeof() 和 Object.getPrototypeOf() 一樣都可以獲取物件的原型物件。

比如 defineProperty; es6 中的 Reflect.defineProperty 和 Object.defineProperty 基本等同,用來為物件定義屬性:

    function myDate() {
    	return false;
    }
    Object.defineProperty(myDate,'now',{
    	value: () => Date.now()
    };
    Refelct.defineProperty(myDate,'now', {
    	value: () => Date.now()
    });
    console.log(Reflect.get(myDate, 'now'));

但是他們之間有一點區別:Object.defineProperty(obj,name,desc) 在無法定義屬性時,會丟擲一個錯誤,而 Reflect.defineProperty(obj,name,desc