1、Object.defineproperty
屬於es5範疇。該方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。
Object.defineProperty(obj, prop, descriptor)
obj
:要在其上定義屬性的對象。
prop
:要定義或修改的屬性的名稱。
descriptor
:將被定義或修改的屬性描述符。
------> 缺點:無法監聽數組元素的變動,或者較深層次的複雜對象時會存在無法響應的問題。
2、Proxy
屬於es6範疇。用於定義基本操作的自定義行爲(如屬性查找,賦值,枚舉,函數調用等)。
let p = new Proxy(target, handler);
target:
用Proxy
包裝的目標對象(可以是任何類型的對象,包括原生數組,函數,甚至另一個代理)。
handler
:一個對象,其屬性是當執行一個操作時定義代理的行爲的函數。
更多詳情:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
3、Reflect
屬於es6範疇。它提供攔截 JavaScript 操作的方法。這些方法與處理器對象的方法相同。Reflect
不是一個函數對象,因此它是不可構造的。
Reflect
沒有構造函數。你不能將其與一個new運算符一起使用,或者將Reflect
對象作爲一個函數來調用。Reflect
的所有屬性和方法都是靜態的(就像Math
對象)。如:
Reflect.apply(
target, thisArgument, argumentsList)
target:目標函數。
thisArgument:target函數調用時綁定的this對象。
argumentsList:target函數調用時傳入的實參列表,該參數應該是一個類數組的對象。
Reflect.get(
target, propertyKey[, receiver])
target:
需要取值的目標對象
propertyKey
:需要獲取的值的鍵值
receiver:如果遇到 getter,此值將提供給目標調用。
......
更多詳見:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect