【问题标题】:Arrow function to avoid bind避免绑定的箭头功能
【发布时间】: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 方法。对于两件事,我将不胜感激。

  1. add_action 使用绑定,因此“this”指的是动作函数中的动物 - 有没有办法使用箭头函数执行此操作 => 所以不需要绑定?

  2. 我认为永远只有一个“世界”,所以这就是为什么我从世界的对象文字开始,而不是让世界成为一个类。是否有另一种“最佳实践”方式可以做到这一点,也许使用类?如果是这样,以另一种方式做有什么真正的优势吗?

【问题讨论】:

  • 我从 world 的对象字面量开始,而不是让 world 成为一个类 如果它只是一个对象,我更喜欢普通对象而不是类,开销和语法噪音更少
  • 无法在箭头函数中更改this 的绑定。
  • 好吧,我只是想如果我使用箭头函数,我根本不需要更改 this 的绑定 - 箭头函数的优点之一是它不会改变this 的值。
  • 我真正要问的是,不是使用this.actions[action_name] = action_function.bind(this);,而是使用箭头函数的语法是什么?

标签: javascript class bind


【解决方案1】:
  1. add_action 使用绑定,因此“this”指的是动作函数中的动物 - 有没有办法使用箭头函数执行此操作 => 所以不需要绑定?

如果你想在动作函数中使用this 来指代动物,不可以。

  1. 我认为永远只有一个“世界”,这就是为什么我从世界的对象文字开始,而不是让世界成为一个类。是否有另一种“最佳实践”方式可以做到这一点,也许使用类?如果是这样,以另一种方式进行是否有任何真正的优势?

如果world 是一个单例,那么除了你已经完成的工作之外,通常不需要做任何事情。

【讨论】:

  • 感谢您的回答!实际上,action 函数中的this 指的是动物。我只是想知道是否可以使用=> 将操作函数分配给actions 的属性,所以不需要bind
  • @TheRatman - 对不起 - 这是两次我误读了这个问题。 :-) 已修复。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 2019-06-25
  • 2018-08-05
相关资源
最近更新 更多