深入理解 ES6中的 Reflect

2021-10-06 22:25:43 字數 3365 閱讀 7287

reflect是es6為了操作物件而新增的api, 為什麼要新增reflect物件呢?它這樣設計的目的是為了什麼?

1)將object物件的一些明顯屬於語言內部的方法(比如object.defineproperty),放到reflect物件上,那麼以後我們就可以從reflect物件上可以拿到語言內部的方法。

2)在使用物件的 object.defineproperty(obj, name, {})時,如果出現異常的話,會丟擲乙個錯誤,需要使用try catch去捕獲,但是使用 reflect.defineproperty(obj, name, desc) 則會返回false。

try  catch(e) 

// 新寫法

if (reflect.defineproperty(target, property, attributes)) else

一:reflect.get(target, name, receiver)

該方法是用來讀取乙個物件的屬性。

引數如下解析:

target:目標物件

name:是我們要讀取的屬性。

receiver(可選): 可以理解為上下文this物件。

二:reflect.set(target,name,value,receiver)

上面的get方法是獲取物件中的值,那麼set就是設定該物件的屬性值了,引數解析簡單如下:

target:我們需要操作的物件。

name:我們需要設定該物件的屬性名。

value:我們要設定的屬性值。

receiver:可以理解為上下文this物件。如果我們在設定值的時候遇到setter函式,該引數就指向與setter中上下文this物件。

該函式會返回乙個boolean的值,代表在目標物件上設定屬性是否成功。

引數解析如下:

target:我們的目標函式.

thisarg:target函式呼叫的時候繫結的this物件。

args:就是函式引數列表。

四:reflect.construct(target,args[, newtarget])

該方法的作用和 new aaa() 建立乙個實列方法作用類似,那麼使用該方法,我們就可以提供一種不使用new來呼叫建構函式的方法,

引數含義如下:

target:被執行的目標函式。

args:呼叫建構函式傳遞的引數陣列或偽陣列。

newtarget:也是建構函式,表示使用 reflect.construct後生成的實列物件是誰的實列。如果沒有該引數,預設生成的實列物件就和target建構函式是一樣的。

五:reflect.defineproperty(target,name,desc)

該方法與object.defineproperty方法類似的,不過唯一的區別是 reflect.defineproperty返回值是乙個boolean的值。

如果使用object.defineproperty的屬性定義失敗了,就會丟擲乙個錯誤,成功的話就會返回這個物件;

reflect.defineproperty如果定義屬性失敗的話就會返回false,如果成功定義的話,就會返回true。

但是如果使用reflect.defineproperty函式,它的第乙個引數不是物件的話,也會丟擲錯誤。

六:reflect.deleteproperty(target,name)

該方法用於刪除乙個物件上的屬性,它和delete操作符類似的。

引數如下:

target:表示要操作的物件。

name:表示要刪除該物件上的屬性。

該函式返回值是乙個boolean的值,如果成功的話,返回true,失敗的話返回false。

七:reflect.has(target,name)

該方法的含義是:檢查乙個物件上是否含有特定的屬性。相當於es5中的in操作符。

那麼引數 target: 就是改物件哦,name的含義是:該物件上的屬性。

八:reflect.ownkeys(target)

該函式的作用是:返回由目標物件自身的屬性鍵組成的陣列。如果這個目標物件不是乙個物件的話,那麼該函式就會丟擲乙個異常。

target引數:它是乙個物件。

九:reflect.preventextensions(target)

該方法的作用是 阻止新的屬性新增到物件中去。target引數必須是乙個物件,否則的話會丟擲乙個異常。

十:reflect.i***tensible(target)

該方法的作用是檢查乙個物件是否可以擴充套件的,也就是說物件裡面是否可以新增新的屬性或方法。

target引數表示目標物件。如果該目標物件不是乙個物件的話,那麼函式會丟擲乙個異常。

該函式會返回乙個boolean值,如果為true的話,說明該物件可以擴充套件,否則的話返回false,表示該物件不可以擴充套件。

十一:reflect.getownpropertydescriptor(target, name)

該方法的引數如下解析:

target:表示的是目標物件。

name:表示目標物件的屬性

該方法的具體含義是:如果目標物件中的屬性描述符存在的話,就返回這個屬性描述符,如果不存在,就返回undefined。

十二:reflect.getprototypeof(target)

該方法是返回乙個物件的原型的,也就是說內部的 [[prototype]] 屬性的值。

十三:reflect.setprototypeof(target, prototype) 

該方法的作用是設定乙個物件的原型。如果設定成功的話,這個物件就返回乙個true,如果設定失敗的話,這個物件就返回乙個false。

深入理解ES6 解構

解構時一種打破資料結構,將其拆分為更小部分的過程。解構在實際開發中經常會應用到物件和陣列中。關於解構的基本用法,請參考 es6 變數的宣告及解構賦值 const node let node 對已經宣告的變數賦值 const node let a,b node const obj let obj co...

深入理解ES6之《ES6中較小的改動》

console.log number.isinteger 25 true console.log number.isinteger 25.0 true console.log number.isinteger 25.1 falseieee 754只能準確的表示 2的53次方到2的53次方的整數 le...

深入理解es6的promise

一 promise入門 1.promise物件是什麼 函式的另一種原生實現,比之前 函式的寫法機構清晰,功能強大,2.以前 這麼寫 function a fn else 1000 呼叫a function m 3.用promise 寫 function a else 1000 呼叫a then fu...