【ES6(2015)】Reflect
文章目錄
- 1. 設計目的
- 2. 常用方法
Reflect對象與Proxy對象一樣,也是ES6 為了操作對象而提供的新 API。
1. 設計目的
- 將Object屬于語言內部的方法放到Reflect上
- 修改某些Object方法的返回結果,讓其變得更合理
- 讓Object操作變成函數行為
- Reflect對象的方法與Proxy對象的方法一一對應,只要是Proxy對象的方法,就能在Reflect對象上找到對應的方法。
與大多數全局對象不同,Reflect沒有構造函數。你不能將其與一個new運算符一起使用,或者將Reflect對象作為一個函數來調用。Reflect的所有屬性和方法都是靜態的(就像Math對象)
2. 常用方法
Reflect.apply()
語法:Reflect.apply(target, thisArgument, argumentsList)
Reflect.apply(Math.floor, undefined, [1.75]) // 1Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]) // "hello"Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index // 4Reflect.apply(''.charAt, 'ponies', [3]) // "i"該方法與ES5中Function.prototype.apply()方法類似:調用一個方法并且顯式地指定this變量和參數列表(arguments) ,參數列表可以是數組,或類似數組的對象。
// ES5 Function.prototype.apply.call(Math.floor, undefined, [1.75])Reflect.construct()
語法:Reflect.construct(target, argumentsList[, newTarget])
Reflect.construct允許你使用可變的參數來調用構造函數
var obj = new Foo(...args) var obj = Reflect.construct(Foo, args)var d = Reflect.construct(Date, [2021, 6, 4]) d instanceof Date // true d.getFullYear() // 2021如果使用 newTarget 參數,則表示繼承了 newTarget 這個超類:
function someConstructor() {} var result = Reflect.construct(Array, [], someConstructor)Reflect.getPrototypeOf(result) // someConstructor.prototype Array.isArray(result) // trueReflect.define?Property()
靜態方法 Reflect.defineProperty() 基本等同于 Object.defineProperty() 方法,唯一不同是返回 Boolean 值。
語法:Reflect.defineProperty(target, propertyKey, attributes)
const people = {} Reflect.defineProperty(people, 'name', {value: 'xiaoming' }) // true people.name // "xiaoming"Reflect.delete?Property()
Reflect.deleteProperty 允許你刪除一個對象上的屬性。返回一個 Boolean 值表示該屬性是否被成功刪除。
語法:Reflect.deleteProperty(target, propertyKey)
var obj = {x: 1,y: 2 } Reflect.deleteProperty(obj, "x") // true obj // { y: 2 }var arr = [1, 2, 3, 4, 5] Reflect.deleteProperty(arr, "3") // true arr // [1, 2, 3, , 5]// 如果屬性不存在,返回 true Reflect.deleteProperty({}, "foo") // true// 如果屬性不可設置,返回 false Reflect.deleteProperty(Object.freeze({foo: 1 }), "foo") // falseReflect.get()
Reflect.get()方法的工作方式,就像從 object 中獲取屬性target[propertyKey],但它是作為一個函數執行的。
語法: Reflect.get(target, propertyKey[, receiver])
// Object var obj = {x: 1,y: 2 } Reflect.get(obj, 'x') // 1// Array Reflect.get(['zero', 'one'], 1) // "one"// Proxy with a get handler var x = {p: 1 } var obj = new Proxy(x, {get(t, k, r) {return k + 'bar'} }) Reflect.get(obj, 'foo') // "foobar"Reflect.set()
允許你在對象上設置屬性。它的作用是給屬性賦值并且就像 property accessor 語法一樣,但是它是以函數的方式。
語法:Reflect.set(target, propertyKey, value[, receiver])
Reflect.get?OwnProperty?Descriptor()
靜態方法 Reflect.getOwnPropertyDescriptor() 與 Object.getOwnPropertyDescriptor() 方法相似。如果在對象中存在,則返回給定的屬性的屬性描述符,否則返回undefined。Reflect.getOwnPropertyDescriptor()的第一個參數不是一個對象(一個原始值),那么將造成 TypeError 錯誤;而對于Object.getOwnPropertyDescriptor,非對象的第一個參數將被強制轉換為一個對象處理。
語法:Reflect.getOwnPropertyDescriptor(target, propertyKey)
Reflect.getOwnPropertyDescriptor({x: 'hello' }, 'x') // {value: "hello", writable: true, enumerable: true, configurable: true}Reflect.getOwnPropertyDescriptor({x: 'hello' }, 'y') // undefinedReflect.getOwnPropertyDescriptor([], 'length') // {value: 0, writable: true, enumerable: false, configurable: false}Reflect.get?PrototypeOf()
靜態方法 Reflect.getPrototypeOf()與 Object.getPrototypeOf() 方法是一樣的。都是返回指定對象的原型(即,內部的 [[Prototype]] 屬性的值)。
語法:Reflect.getPrototypeOf(target)
Reflect.has()
檢查一個對象是否擁有某個屬性, 相當于in 操作符。
語法:Reflect.has(target, propertyKey)
Reflect.isExtensible()
判斷一個對象是否可擴展 (即是否能夠添加新的屬性),它與 Object.isExtensible()方法一樣。
Reflect.own?Keys()
返回一個由目標對象自身的屬性鍵組成的數組。它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
語法:Reflect.ownKeys(target)
Reflect.prevent?Extensions()
阻止新屬性添加到對象。
語法:Reflect.preventExtensions(target)
// Objects are extensible by default. var empty = {} Reflect.isExtensible(empty) // === true// ...but that can be changed. Reflect.preventExtensions(empty) Reflect.isExtensible(empty) // === falseReflect.set?PrototypeOf()
改變指定對象的原型 (即,內部的 [[Prototype]] 屬性值)。
語法:Reflect.setPrototypeOf(target, prototype)
Reflect.setPrototypeOf({}, Object.prototype) // true// It can change an object's [[Prototype]] to null. Reflect.setPrototypeOf({}, null) // true// Returns false if target is not extensible. Reflect.setPrototypeOf(Object.freeze({}), null) // false// Returns false if it cause a prototype chain cycle. var target = {} var proto = Object.create(target) Reflect.setPrototypeOf(target, proto) // false 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【ES6(2015)】Reflect的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Ant Design Vue】之lay
- 下一篇: 【ES6(2015)】Symbol