日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【ES6(2015)】Reflect

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【ES6(2015)】Reflect 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 設計目的
  • 2. 常用方法

Reflect對象與Proxy對象一樣,也是ES6 為了操作對象而提供的新 API。

1. 設計目的

  • 將Object屬于語言內部的方法放到Reflect上
let obj = {} let newVal = '' Reflect.defineProperty(obj, 'name', {get() {return newVal},set(val) {newVal = val} }) obj.name = 'xiaoming' console.log(obj.name) // xiaoming
  • 修改某些Object方法的返回結果,讓其變得更合理
// ES5 Object 報錯 try {Object.defineProperty(target, property, attributes)// success } catch (e) {// failure }// ES6 Reflect 返回Boolean值 if (Reflect.defineProperty(target, property, attributes)) {// success } else {// failure }
  • 讓Object操作變成函數行為
// ES5 'assign' in Object // true// ES6 Reflect.has(Object, 'assign') // true
  • Reflect對象的方法與Proxy對象的方法一一對應,只要是Proxy對象的方法,就能在Reflect對象上找到對應的方法。
Proxy(target, {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沒有構造函數。你不能將其與一個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) // true

Reflect.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") // false

Reflect.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])

// Object var obj = {} Reflect.set(obj, "prop", "value") // true obj.prop // "value"// Array var arr = ["duck", "duck", "duck"] Reflect.set(arr, 2, "goose") // true arr[2] // "goose"// It can truncate an array. Reflect.set(arr, "length", 1) // true arr // ["duck"]// With just one argument, propertyKey and value are "undefined". var obj = {} Reflect.set(obj) // true Reflect.getOwnPropertyDescriptor(obj, "undefined") // { value: undefined, writable: true, enumerable: true, configurable: true }

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) // === false

Reflect.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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。