【发布时间】:2020-05-16 16:22:44
【问题描述】:
var world = {
animals: {},
add_animal: function(options) {
this.animals[options.name] = {
name: options.name,
sound: options.sound,
actions: {},
add_action: function(action_name, action_function) {
this.actions[action_name] = action_function.bind(this);
}
}
}
};
world.add_animal({name: "dog", sound: "bark"});
world.animals.dog.add_action("speak", function() {
alert("I am a " + this.name + ". I " + this.sound + ".");
});
world.animals.dog.actions.speak();
这是我几年前编写的脚本的简化版本,我想对其进行更新。它创建了一个世界对象,其中包含一组动物和一个 add_animal 方法。每个动物都有一个 add_action 方法。对于两件事,我将不胜感激。
add_action 使用绑定,因此“this”指的是动作函数中的动物 - 有没有办法使用箭头函数执行此操作 => 所以不需要绑定?
我认为永远只有一个“世界”,所以这就是为什么我从世界的对象文字开始,而不是让世界成为一个类。是否有另一种“最佳实践”方式可以做到这一点,也许使用类?如果是这样,以另一种方式做有什么真正的优势吗?
【问题讨论】:
-
我从 world 的对象字面量开始,而不是让 world 成为一个类 如果它只是一个对象,我更喜欢普通对象而不是类,开销和语法噪音更少
-
无法在箭头函数中更改
this的绑定。 -
好吧,我只是想如果我使用箭头函数,我根本不需要更改
this的绑定 - 箭头函数的优点之一是它不会改变this的值。 -
我真正要问的是,不是使用
this.actions[action_name] = action_function.bind(this);,而是使用箭头函数的语法是什么?
标签: javascript class bind