• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • handler.defineProperty()

    handler.defineProperty()用于拦截对对象的Object.defineProperty()操作。

    语法

    var p = new Proxy(target, {
      defineProperty: function(target, property, descriptor) {
      }
    });
    

    参数

    下列参数将会被传递给defineProperty方法。 this绑定在 handler 对象上。

    target
    目标对象。
    property
    待检索其描述的属性名。
    descriptor
    待定义或修改的属性的描述符。

    返回值

    defineProperty方法必须以一个Boolean返回,表示定义该属性的操作成功与否。

    描述

    handler.defineProperty()用于拦截对对象的Object.defineProperty()操作。

    拦截

    该方法会拦截目标对象的以下操作:

    • Object.defineProperty()
    • Reflect.defineProperty()
    • proxy.property='value'

    不变量

    如果违背了以下的不变量,proxy会抛出TypeError:

    • 如果目标对象不可扩展,将不能添加属性。
    • 不能添加或者修改一个属性为不可配置的,如果它不作为一个目标对象的不可配置的属性存在的话。
    • 如果目标对象存在一个对应的可配置属性,这个属性可能不会是不可配置的。
    • 如果一个属性在目标对象中存在对应的属性,那么Object.defineProperty(target, prop, descriptor)将不会抛出异常。
    • 在严格模式下,false作为 handler.defineProperty方法的返回值的话将会抛出TypeError异常.

    示例

    以下代码演示如何拦截对目标对象的Object.defineProperty()操作。

    var p = new Proxy({}, {
      defineProperty: function(target, prop, descriptor) {
        console.log('called: ' + prop);
        return true;
      }
    });
    
    var desc = { configurable: true, enumerable: true, value: 10 };
    Object.defineProperty(p, 'a', desc); // "called: a"
    

    当调用Reflect.defineProperty(),传递给definePropertydescriptor有一个限制- 只有以下属性才有用,非标准的属性将会被无视:

    • enumerable
    • configurable
    • writable
    • value
    • get
    • set
    var p = new Proxy({}, {
      defineProperty(target, prop, descriptor) {
        console.log(descriptor);
        return Reflect.defineProperty(target, prop, descriptor);
      }
    });
    
    Object.defineProperty(p, 'name', {
      value: 'proxy',
      type: 'custom'
    });  // { value: 'proxy' }