【问题标题】:Dynamic property values instead of function?动态属性值而不是函数?
【发布时间】:2017-01-09 16:29:29
【问题描述】:

是否可以给一个对象一个动态 属性,或者更确切地说给一个对象属性一个动态 ?例如:

var obj = {
    a: 0,
    b: 5,
    c: //should always be a+b
}

显然我可以使用 方法 c=function(){return a+b},但我总是需要使用大括号(obj.c() 而不是 @ 987654325@)。这并不是一个真正的问题,但我相信它必须以某种方式工作,因为length 属性中的构建也是一个属性,而不是一个函数。此属性随对象动态变化,而不是函数...

var str = "hello world";
console.log(str.length); //11
str = "hello stack overflow";
console.log(str.length); //20

属性值在没有更新的情况下发生变化...

我希望你能帮助我:)

【问题讨论】:

  • 您正在寻找 ES5 吸气剂。但是.length 不是动态的;字符串是不可变的。
  • 正如@SLaks 提到的,重要的是要注意String#length 不是动态属性,因为字符串的内部值无法更改。
  • 您的字符串示例并不能证明您的观点。您正在创建另一个长度不同的新字符串。与您的对象等效的是:var obj = {c: 21}; console.log(obj.c); obj = {c: 42}; console.log(obj.c);。看,c 也“动态地”改变了;)

标签: javascript object methods dynamic properties


【解决方案1】:

在创建对象时定义getter,或稍后使用Object#defineProperty添加:

var obj = {
  a: 0,
  b: 5,
  get c() { // assign it at object creation
    return this.a + this.b;
  }
};

console.log(obj.c);

// add it to existing object
Object.defineProperty(obj, 'd', {
  get: function() {
    return this.a + this.b + this.c;
  }
});


console.log(obj.d);

【讨论】:

    【解决方案2】:

    除了 getter,您还可以使用 ES6 功能,Proxy

    Proxy 对象用于定义基本操作(例如属性查找、赋值、枚举、函数调用等)的自定义行为。

    var obj = {
            a: 0,
            b: 5,
        },
        p = new Proxy(obj, {
            get: function(target, prop) {
                return prop === 'c' ? target.a + target.b : target[prop];
            }
        });
       
    console.log(p.c); // 5

    【讨论】:

      【解决方案3】:

      您可以使用getter

      var o = {
         a : 0; 
         b : 1;
         get c () {return this.a + this.b;}
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 2020-03-12
        相关资源
        最近更新 更多