Proxy handler.defineProperty() 方法
關於Proxy更多內容可以參閱Proxy和Reflect一章節。
此方法會攔截Object.defineProperty或者Reflect.defineProperty()操作。
返回一個布林值用來說明操作是否成功。
語法結構:
[JavaScript] 純文字檢視 複製程式碼var p = new Proxy(target, { defineProperty: function (target, property, descriptor) { //code } })
引數解析:
(1).target:可選,要被代理的目標物件。
(2).property:可選,屬性名稱。
(3).descriptor:可選,property屬性的描述物件。
特別說明:
(1).如果target物件是不可擴充套件的,向其新增屬性會報錯。
(2).不能向target物件新增一個新的不可配置的屬性,否則會報錯。
(3).不能將target物件的屬性修改為不可配置,否則會報錯。
(4).如果handler.defineProperty()返回false,那麼也會丟擲一個錯誤。
程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let antzone = {}; var p = new Proxy(antzone, { defineProperty: function(target, prop, descriptor) { console.log(prop); Reflect.defineProperty(target, prop, descriptor); return true; } }); var desc = { configurable: true, enumerable: true, value:"螞蟻部落" }; Object.defineProperty(p, "webName", desc); console.log(antzone.webName);
上面的程式碼攔截了Object.defineProperty()操作;handler.defineProperty()返回值是true,表明新增成功。
Object.defineProperty()可以參閱Object.defineProperty()一章節。
[JavaScript] 純文字檢視 複製程式碼執行程式碼var antzone = { webName:"螞蟻部落" } var p = new Proxy(antzone, { defineProperty: function (target, prop, descriptor) { return true; } }); var desc = { configurable: true, enumerable: true, value: 4 }; Object.defineProperty(p, "age", desc); console.log(antzone.age);
大家不要誤以為返回值是true就一定為target物件重新配置了屬性,handler.defineProperty()方法僅僅是攔截配置操作。
[JavaScript] 純文字檢視 複製程式碼執行程式碼var antzone = { webName:"螞蟻部落" } var p = new Proxy(antzone, { defineProperty: function (target, prop, descriptor) { return true; } }); var desc = { configurable: false, enumerable: true, value: "antzone" }; Object.defineProperty(p, "webName", desc);
如果target物件中原來不存在指定名稱的不可擴充套件的屬性,那麼向其新增或者將其修改成不可擴充套件的屬性會報錯。
[JavaScript] 純文字檢視 複製程式碼var antzone = { webName:"螞蟻部落" } var p = new Proxy(antzone, { defineProperty: function (target, prop, descriptor) { return true; } }); var desc = { configurable: false, enumerable: true, value: 4 }; Object.defineProperty(p, "age", desc);
如果為target物件新新增一個不可配置的屬性,那麼就會報錯。
[JavaScript] 純文字檢視 複製程式碼var antzone = { webName:"螞蟻部落" } var p = new Proxy(antzone, { defineProperty: function (target, prop, descriptor) { return true; } }); var desc = { configurable: false, enumerable: true, value: "antzone" }; Object.defineProperty(p, "webName", desc);
將target物件的可配置屬性修改為不可配置就會報錯。
[JavaScript] 純文字檢視 複製程式碼var antzone = { webName:"螞蟻部落" } var p = new Proxy(antzone, { defineProperty: function (target, prop, descriptor) { Reflect.defineProperty(target, prop, descriptor); return true; } }); var desc = { configurable: true, enumerable: true, value: 4 }; Reflect.defineProperty(p, "age", desc); console.log(antzone.age);
由上面的程式碼可以看出,Reflect.defineProperty()操作也會被攔截。
相關文章
- Proxy.revocable() 方法
- Proxy handler.set() 方法
- Proxy handler.ownKeys() 方法
- Proxy handler.isExtensible() 方法
- Proxy handler.preventExtensions() 方法
- Proxy handler.construct() 方法Struct
- Proxy handler.has() 方法
- Proxy handler.get() 方法
- Proxy handler.deleteProperty() 方法delete
- Proxy handler.getOwnPropertyDescriptor() 方法
- Proxy handler.apply() 方法APP
- Proxy handler.setPrototypeOf() 方法
- Proxy handler.getPrototypeOf() 方法
- Proxy代理資料攔截方法
- 淺談jQuery中$.proxy()工具方法jQuery
- 使用 `open-uri.with_proxy` 方法開啟網頁網頁
- Many To Many could not initialize proxy – no Session的解決方法Session
- Proxy
- docker – nginx – proxy_pass + proxy_redirectDockerNginx
- ShardingSphere-Proxy 前端協議問題排查方法及案例前端協議
- proxy 收集
- Proxy invocationHandler
- Proxy模式模式
- 代理模式(Proxy)模式
- 2.1.2.3 Proxy PDBs
- JavaScript 之 ProxyJavaScript
- 初識Proxy
- Proxy 攔截
- Proxy介紹
- go 語言 proxy.golang.org timeout 無法訪問 處理方法Golang
- 安卓 no_proxy安卓
- 代理模式(Proxy Pattern)模式
- zabbix分散式proxy分散式
- What are the benefits of using an proxy?
- Proxy使用詳解
- 代理(Proxy)的解析
- Cglib proxy探祕CGLib
- Proxy例項set()