JavaScript | handler.defineProperty() 方法
Javascript 中的handler.defineProperty()方法用于定义新属性并直接在对象上修改现有属性。这是Object.defineProper()的陷阱。
句法:
const p = new Proxy(target, {
defineProperty: function(target, property, descriptor) {
}
});
参数:此方法接受三个参数,如上所述,如下所述:
- Target:此参数保存目标对象。
- property:此参数是要检索其描述的属性的名称或符号。
- 描述符:此参数是正在定义或修改的属性的描述符。
返回值:此方法返回一个布尔值,用于指示属性是否成功定义。
下面的示例说明了 JavaScript 中的handler.defineProperty() 方法:
示例 1:
javascript
const p = new Proxy({}, {
defineProperty: function(target, prop, descriptor) {
console.log('Type : ' + prop);
return true;
}
});
const desc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(p, 'String', desc);
var xyz = {};
var proxy = new Proxy(xyz, {
defineProperty: function(target, name, propertyDescriptor) {
console.log('in defineProperty');
return Object.defineProperty(target, name, propertyDescriptor);
}
});
Object.defineProperty(proxy, 'bar', {} );
javascript
const handler1 = {
defineProperty(target, key, descriptor) {
invariant(key, 'define');
return true;
}
};
function invariant(key, action) {
if (key[0] === '_') {
throw new Error(
`Invalid attempt to ${action} private "${key}" property`);
}
}
const monster1 = {};
const proxy1 = new Proxy(monster1, handler1);
console.log(proxy1._propt = 'Handler defineProperty');
输出:
"Type : String"
"in defineProperty"
示例 2:
javascript
const handler1 = {
defineProperty(target, key, descriptor) {
invariant(key, 'define');
return true;
}
};
function invariant(key, action) {
if (key[0] === '_') {
throw new Error(
`Invalid attempt to ${action} private "${key}" property`);
}
}
const monster1 = {};
const proxy1 = new Proxy(monster1, handler1);
console.log(proxy1._propt = 'Handler defineProperty');
输出:
Error: Invalid attempt to define private "_propt" property
支持的浏览器: handler.defineProperty() 方法支持的浏览器如下:
- 谷歌浏览器 49 及更高版本
- 火狐 18 及以上
- Opera 36 及以上
- Safari 10 及更高版本
- 边缘 12 及以上