对象的描述属性对proxy的影响,defineProperties对proxy影响

get

如果一属性是不可配置( configurable: false)&& 不可写( writable: false),那么Proxy不能修改改属性,否则通过Proxy对象访问该属性会报错

 const target = Object.defineProperties({
    
    }, {
    
    
      name: {
    
    
        value: 'ming',
        writable: false,
        configurable: false
      }
    })
    const hander = {
    
    
      get(target,propKey) {
    
    
        return 'abc'
      }
    }
    const proxy = new Proxy(target,hander)
   console.log(proxy.name)

报错:
Uncaught TypeError: ‘get’ on proxy: property ‘name’ is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected ‘ming’ but got ‘abc’)

翻译:属性name是代理目标上的只读且不可配置的数据属性,但代理没有返回其实际值(预期为ming,但得到了abc)

set

如果目标对象自身的某个属性不可写,那么set方法将不起作用

const obj = {
    
    };
    Object.defineProperties(obj,{
    
    
      name: {
    
    
        value: 'f',
        writable: false
      }
    })
    const proxy = new Proxy(obj, {
    
    
      set(target,propKey,value,receiver) {
    
    
        obj[propKey] = 'kate'
        return true
      }
    })
    proxy.name = 'k'

报错:Uncaught TypeError: ‘set’ on proxy: trap returned truish for property ‘name’ which exists in the proxy target as a non-configurable and non-writable data property with a different value
翻译:
未捕获的TypeError: 'set’在代理上:trap为属性’name’返回truish,该属性存在于代理目标中,作为一个不可配置和不可写的数据属性,具有不同的值

注意,set代理应当返回一个布尔值。严格模式下,set代理如果没有返回true,就会报错。
经过自己实践,不是严格模式的话就不会报错

'use strict';
const handler = {
    
    
  set: function(obj, prop, value, receiver) {
    
    
    obj[prop] = receiver;
    // 无论有没有下面这一行,都会报错
    return false;
  }
};
const proxy = new Proxy({
    
    }, handler);
proxy.foo = 'bar';
// TypeError: 'set' on proxy: trap returned falsish for property 'foo'
// Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'name'
// 未捕获的TypeError: 'set'上的代理:陷阱返回假的属性'name'

上面代码中,严格模式下,set代理返回false或者undefined,都会报错。

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/128199397