代码之家  ›  专栏  ›  技术社区  ›  mbilyanov

用javascript从基对象创建动态getter和setter?

  •  1
  • mbilyanov  · 技术社区  · 5 年前

    这是我的基本对象:

    let resources = {
        TEST_FLAG: false,
        FRUIT: 'banana',
        ID: 11
    };
    

    我想通过一个 setter 还有一个 getter

    let dynamicResources = resources
    
    for (let key in resources) {
        Object.defineProperty(dynamicResources, key, {
            get() {
                console.log(`[debug]: GET <${key}>, VALUE <${this[key]}>`);
                return `${this[key]}`;
            },
    
            set(value) {
                console.log(`[debug]: SET <${key}>, VALUE <${this[key]}>`);
                this[key] = value;
            }
        });
    }
    

    我们的想法是 吸气剂 设定者 可以从具有任意数量属性的基对象生成。

    当我 console.log()

    {
      TEST_FLAG: [Getter/Setter],
      FRUIT: [Getter/Setter],
      ID: [Getter/Setter]
    }
    

    这表明工厂回路已经工作。但是,当我这样做时:

    dynamicResources.FRUIT = 'berry';
    

    我得到以下错误:

      set: function set(value) {
      RangeError: Maximum call stack size exceeded
    

    2 回复  |  直到 5 年前
        1
  •  2
  •   Hasan Delibaş    5 年前

    使用 建造师。期待 Developer Mozilla Proxy Page

    var dynamicObject = new Proxy({
       TEST_FLAG: false,
       FRUIT: 'banana',
       ID: 11
      },{
      get:function(target,key){
       console.log(`get ${key} value. value is: ${target[key]}`);
       return target[key]
      },
      set:function(target,key,val){
        console.log(`set ${key} value. old value is:${target[key]} new value is ${val}`)
        target[key] = val;
        return true;
      }
    })
    
    console.log(dynamicObject.ID);
    dynamicObject.ID = 25;
    
    
    
    
    // Output is:
    /*
    get ID value. value is: 11
    11
    set ID value. old value is:11 new value is 25
    */
        2
  •  1
  •   Johnny Zabala    5 年前

    let resources = {
        TEST_FLAG: false,
        FRUIT: 'banana',
        ID: 11
    };
    
    let dynamicResources = {
        _state: {...resources}
    }
    
    for (let key in resources) {
        Object.defineProperty(dynamicResources, key, {
            get() {
                const internalKey = key
                return this._state[internalKey]
            },
            set(value) {
                const internalKey = key
                this._state[internalKey] = value;
            }
        });
    }
    console.log(dynamicResources.FRUIT)
    dynamicResources.FRUIT = 'berry';
    console.log(dynamicResources.FRUIT)