📜  JavaScript | handler.defineProperty() 方法

📅  最后修改于: 2022-05-13 01:56:38.615000             🧑  作者: Mango

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 及以上