让我们考虑以下几点:
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
如何引用。好吧,我想在这里做同样的事情。
答案 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';
......那么它会做(我想)你想做的事情。