handler.set() - JavaScript 编辑
handler.set()
方法是设置属性值操作的捕获器。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
语法
const p = new Proxy(target, { set: function(target, property, value, receiver) { } });
参数
以下是传递给 set()
方法的参数。this
绑定在 handler 对象上。
target
- 目标对象。
property
- 将被设置的属性名或
Symbol
。 value
- 新属性值。
receiver
- 最初被调用的对象。通常是 proxy 本身,但 handler 的 set 方法也有可能在原型链上,或以其他方式被间接地调用(因此不一定是 proxy 本身)。
比如:假设有一段代码执行
obj.name = "jen"
,obj
不是一个 proxy,且自身不含name
属性,但是它的原型链上有一个 proxy,那么,那个 proxy 的set()
处理器会被调用,而此时,obj
会作为 receiver 参数传进来。
返回值
set()
方法应当返回一个布尔值。
- 返回
true
代表属性设置成功。 - 在严格模式下,如果
set()
方法返回false
,那么会抛出一个TypeError
异常。
描述
handler.set()
方法用于拦截设置属性值的操作。
拦截
该方法会拦截目标对象的以下操作:
- 指定属性值:
proxy[foo] = bar
和proxy.foo = bar
- 指定继承者的属性值:
Object.create(proxy)[foo] = bar
Reflect.set()
约束
如果违背以下的约束条件,proxy 会抛出一个 TypeError
异常:
- 若目标属性是一个不可写及不可配置的数据属性,则不能改变它的值。
- 如果目标属性没有配置存储方法,即
[[Set]]
属性的是undefined
,则不能设置它的值。 - 在严格模式下,如果
set()
方法返回false
,那么也会抛出一个TypeError
异常。
示例
以下代码演示如何捕获属性的设置操作。
var p = new Proxy({}, {
set: function(target, prop, value, receiver) {
target[prop] = value;
console.log('property set: ' + prop + ' = ' + value);
return true;
}
})
console.log('a' in p); // false
p.a = 10; // "property set: a = 10"
console.log('a' in p); // true
console.log(p.a); // 10
规范
规范 |
---|
ECMAScript (ECMA-262) [[Set]] |
浏览器兼容性
BCD tables only load in the browser
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.另见
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论