让我们考虑以下几点:
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/