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

标签 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 是如何用引号引起来的。好吧,我想在这里做同样的事情。

最佳答案

考虑一下:

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——命名为“setterName”的属性——而不是 message[setterName],它与 message.message 相同。

如果您将代码更改为:

message[setterName] = 'hello world';

...然后它将执行(我认为)您正在尝试执行的操作。

关于javascript - 为什么我不能通过对象中定义的字符串调用 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35810860/

相关文章:

javascript - 是否值得在 CMS 中使用 TypeScript?

javascript - 在 Javascript 的内联函数中将参数作为值传递

javascript改变字符串大小写速度

javascript - 外部 API 未处理 CORS 预检请求

javascript - 占位符不更新选项值

javascript - 为什么在使用完整渲染或浅渲染时,带有组件 Prop 的 enzyme find() 的工作方式不同?

javascript - 在回调中获取 Meteor.subscribe

javascript - 我们还在 es6+ 中使用 iife

javascript - 如果 bool 值在没有 $watch 的情况下发生变化,是否可以将 bool 值传递给指令并触发某些内容?

javascript - for...of 循环。我应该使用 const 还是 let?