基本概念
reflect是一個(gè)內(nèi)置的對(duì)象,提供了攔截JavaScript操作的方法(主要作用)。它將部分屬于語(yǔ)言內(nèi)部的方法轉(zhuǎn)移到reflect上去,比如defineProperty。優(yōu)化了一部分函數(shù)的返回結(jié)果,它的風(fēng)格上傾向于函數(shù)式編程,保留對(duì)象的默認(rèn)行為(Proxy),沒有構(gòu)造函數(shù),所有的屬性方法都是靜態(tài)的,類似Math。reflect和Proxy是一一對(duì)應(yīng)的,所有Proxy可以攔截的屬性,reflect提供一個(gè)默認(rèn)。。
靜態(tài)方法
- get ,取值操作, 不存在返回undefined
內(nèi)部this綁定receiverReflect.get(target, propertyKey[, receiver]);var object1 = { a: 1, b: 2, get c() { return this.a + this.b; }, }; var object2 = { a: 4, b: 4, }; Reflect.get(object1, 'c'); // 3 Reflect.get(object1, 'c', object2); // 8 - set,賦值操作
同get一樣,也是內(nèi)部this綁定receiver。Reflect.set(target, propertyKey, value[, receiver]);
與Proxy同時(shí)使用 , 傳遞receiver會(huì)觸發(fā)defineProperty,觸發(fā)defineProperty的前提是一定要先傳遞receiver。var object1 = { a: 1, set b(value) { return this.a = value; }, }; var object2 = { a: 0, }; Reflect.set(object1, 'b', 2, object2); // true object1 //{a:1} object2 //{a:2} object1.foo // undeifined object2.foo; // undeifinedlet object = { a: 1 }; let handler = { set(target, key, value, receiver) { console.log('set value', value); Reflect.set(target, key, value, receiver) }, defineProperty(target, key, attribute) { console.log('defineProperty', attribute); Reflect.defineProperty(target, key, attribute); } }; let obj = new Proxy(object, handler); obj.a = 2; // set value 2 defineProperty {value: 2} 2 - has,對(duì)象是否包含某個(gè)屬性,返回布爾值
Reflect.has(target, propertyKey); var object = { a: 1, }; Reflect.has(object, 'a'); // true - deleteProperty,刪除某個(gè)屬性,返回布爾值
Reflect.deleteProperty(target, propertyKey); var object = { a: 1, }; Reflect.deleteProperty(object, 'a'); // true - construct,new操作
Reflect.construct(target, argumentsList[, newTarget]); function Teacher(name) { this.name = name; } const eric = Reflect.construct(Teacher, ['Eric']); // Teacher {name: "Eric"} - getPrototypeOf,讀取proto屬性
Reflect.getPrototypeOf(target); function Teacher(name) { this.name = name; } const eric = Reflect.construct(Teacher, ['Eric']); Reflect.getPrototypeOf(eric) === Teacher.prototype; // true - setPrototypeOf , 設(shè)置目標(biāo)對(duì)象原型 , 返回布爾值
Reflect.setPrototypeOf(target, prototype); const object = {}; Reflect.setPrototypeOf(object, Array.prototype); object.length; // 0 - apply , 綁定this對(duì)象執(zhí)行給定函數(shù)
Reflect.apply(target, thisArgument, argumentsList); const list = [1, 2, 3, 4, 5, 6]; const min = Reflect.apply(Math.min, Math, list); - defineProperty , 對(duì)象定義屬性
Reflect.defineProperty(target, propertyKey, attributes); let object = {}; Reflect.defineProperty(object, 'name', { value: 'Eric' }); // {name: "Eric"} - getOwnPropertyDescriptor , 獲取指定屬性的描述對(duì)象
Reflect.getOwnPropertyDescriptor(target, propertyKey); - isExtensible , 返回指定對(duì)象是否可擴(kuò)展
Reflect.isExtensible(target); - preventExtensions , 阻止對(duì)象擴(kuò)展
Reflect.preventExtensions(target); var empty = {}; Reflect.isExtensible(empty); /* true */ Reflect.preventExtensions(empty); Reflect.isExtensible(empty); // false - ownKeys , 返回對(duì)象的所有屬性(包含Symbol)
Reflect.ownKeys(target); var object = { a: 1, b: 2, [Symbol.for('c')]: 3, [Symbol.for('d')]: 4, }; Reflect.ownKeys(object); // ["a", "b", Symbol(c), Symbol(d)]