2015-11-25 64 views
0

我需要爲嵌套對象在JavaScript中創建getter和setter。 目前我在下面的代碼中使用Object.defineProperty()Getter和Setter的簡潔定義,用於在ES5或ES6中嵌套對象的屬性

針對ES5或ES6。

我想

  • 你知道一個更簡潔的方式(或更好的替代品)來寫這個?
  • 對getter和setter屬性使用.bind(base)的替代解決方案。

 var base = { 
 
      _name: 'default', 
 
      _properties: { 
 
       _top: 0 
 
      }, 
 
      constructor: function() { 
 
      } 
 
     }; 
 

 
     Object.defineProperty(base, 'name', { 
 
      get: function() { 
 
       return this._name; 
 
      }, 
 
      set: function (value) { 
 
       this._name = value; 
 
      } 
 
     }); 
 
     Object.defineProperty(base, 'properties', { 
 
      get: function() { 
 
       return this._properties; 
 
      }, 
 
      set: function (value) { 
 
       this._properties = value; 
 
      } 
 
     }); 
 
     // nesting properties 
 
     Object.defineProperty(base.properties, 'top', { 
 
      get: function() { 
 
       return this._properties._top; 
 
      }.bind(base), 
 
      set: function (value) { 
 
       this._properties._top = value; 
 
       console.log('WORKS!'); 
 
      }.bind(base) 
 
     }); 
 

 
     console.log(base.name); 
 
     base.name = 'Foo'; 
 
     console.log(base.name); 
 
     console.log(base.properties.top); 
 
     base.properties.top = 1000; 
 
     console.log(base.properties.top);

+1

是ES6語法好嗎? –

+1

@JonSurrell是的ES5和ES6是好的,我編輯了我的問題......謝謝! – GibboK

回答

1

這是想法?通過jsbin上的babel測試和工作es6。

var base = { 
    _name: 'default', 
    get name() { 
    return this._name; 
    }, 

    set name(n) { 
    return this._name = n; 
    }, 

    _properties: { 
    _top: 0, 
    get top() { 
     return this._top; 
    }, 
    set top(t) { 
     return this._top = t; 
    }, 

    }, 

    get properties() { 
    return this._properties; 
    }, 

}; 

或者基於類的版本:

class Base { 
    constructor() { 
    this._name = 'default'; 
    this._properties = { 
     _top: 0, 
     get top() { return this._top; }, 
     set top(val) { return this._top = val; } 
    }; 
    } 

    get name() { 
    return this._name; 
    } 

    set name(n) { 
    return this._name = n; 
    } 

    get properties() { 
    return this._properties; 
    } 

} 

var b = new Base(); 
相關問題