《es6標準入門》知識整理(4)- Reflect
阿新 • • 發佈:2019-04-12
昨天,我做了 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