为什么我不能通过对象中定义的字符串调用setter?

时间:2016-03-05 06:20:19

标签: javascript ecmascript-6

让我们考虑以下几点:

export default () => {
  let _message = '';

  return  {

    set message(msg) {
       _message = msg;
    },

    get message() {
      return _message;
    }
  }
}

我们假设您将其导入为Message

const message = Message();

现在让我们给你一个对象:const messageObject = {setterName: 'message'};

所以我们这样做:

const setterName = messageObject.setterName;
message.setterName = 'hello world';

console.log(message.message); // => ''

为什么这是空的?为什么我不这样做?有什么我想念的吗?

如果可能的话,我将如何开展这项工作?

更新

你们当中有些人似乎非常困惑。让我们考虑一下如何实际使用上面的代码而不是我如何使用它:

const message = Message();
message.message = 'hello world';
console.log(message.message); // => 'hello world';

对象:

const messageObject = {setterName: 'message'};

包含setterName密钥,其值为'message'。在这种情况下,我应该可以做与上面完全相同的事情,接受我应该能够使用setterName

const setterName = messageObject.setterName; // This is message. Remember that.
message.setterName = 'hello world';

// The above (should) in my mind should be the same as:
// message.message = 'hello world';

console.log(message.message); // (should) => 'hello world'

我希望这会让事情更清楚。在像PHP这样的其他语言中我会这样做:

call_user_func_array(array(Message, 'setMessage'), array('hello world'));

请注意setMessage如何引用。好吧,我想在这里做同样的事情。

1 个答案:

答案 0 :(得分:3)

考虑一下:

var o1 = { prop:"cats" };
var o2 = { cats:42 };
var propertyName = o1.prop;
console.log( o2.propertyName  ); // undefined
console.log( o2[propertyName] ); // 42

您将setterName设置为字符串"message"(通过复杂的路线,就像我上面所做的那样),但是您尝试与message.setterName对话 - 属性NAMED“setterName” - 而不是与message[setterName]相同的message.message

如果您将代码更改为:

message[setterName] = 'hello world';

......那么它会做(我想)你想做的事情。