每次调用对象属性时从函数返回一个值

时间:2012-11-17 17:24:57

标签: javascript prototype

我在javascript中有一个人为的例子来解释我想要做的事情:

我有一个对象:

var Item = {
  _first = undefined,
  _second = undefined,
  whole = putTogether()
};

function putTogether() {
  if (_first && _second) 
    return _first + '_' + _second;

  return '{ Invalid Values }';
}

我正在尝试访问Item.whole作为财产。有没有办法可以这样做,以便每次访问putTogether时都会对它进行评估,而不是最初在创建对象时进行评估?

我知道我可以为Item.whole定义一个匿名函数,但我特意尝试构造它,以便它可以作为值而不是函数引用。

2 个答案:

答案 0 :(得分:2)

这叫做吸气剂。是的,这是可能的:

var Item = {
  _first: undefined,
  _second: undefined
};
function putTogether() {
  if (this._first && this._second) 
    return this._first + '_' + this._second;
  return '{ Invalid Values }';
}

Object.defineProperty(Item, 'whole', {
    get: putTogether
});

答案 1 :(得分:1)

你可以这样做:

var Item = {
    _first : undefined,
    _second : undefined
};

Object.defineProperty(Item, "whole", {
    get : function(){
        if (this._first && this._second)  return this._first + '_' + this._second;
        return '{ Invalid Values }';
    },
});

console.log(Item.whole); // prints  { Invalid Values }
Item._first = "a";
Item._second = "b";
console.log(Item.whole); // prints a_b 

Demonstration

MDN reference of defineProperty