在主干中向原型对象添加值不起作用

Adding a value to a prototype object in backbone not working

本文关键字:对象 添加 不起作用 原型      更新时间:2023-09-26

在主干中,我有一个视图,其中包含一个名为"mistakes_dict"的自定义原型对象。我想记录所犯的错误,所以我希望mistakes_dict坚持下去。但是,当"next_stage"方法运行时,我收到一个错误,未定义mistakes_dict。为什么会这样?当我在 nexstage 方法中本地定义错误 dict 时,它工作正常,但当然,下次该方法运行时,相同的字典不可用。

作为旁注,如果字典尚不存在(值为 1),我如何使字典创建一个新键,如果它确实存在,则将其递增 1?我知道如何在Python中做到这一点,但我是JS的新手。

window.View = Backbone.View.extend({
    mistakes_dict: {},
    initialize: function () {
        this.render();
    },
    events: {
        "click .nextstage"   : "nextstage"
    },
    nextstage: function () {
      var mistakes_string = $("span.highlighted").text();
      for(var i = 0, len = mistakes_string.length; i < len; i++){
        mistakes_dict[mistakes_string[i]] = 1;
      };
    },
    render: function () {
      this.$el.html(this.template(this.model.toJSON()));
        return this;
    }
});

您在window.View = Backbone.View.extend({ ... })中定义的内容附加到原型中,因此您必须通过this访问它们:

for(var i = 0, len = mistakes_string.length; i < len; i++){
    this.mistakes_dict[mistakes_string[i]] = 1;
}

当然,由于mistakes_dict实际上附加到视图原型,因此您将在View的所有实例之间共享单个mistakes_dict对象;您可以将原型上的属性视为类属性。如果您希望在每个实例上具有不同的mistakes_dict,请在构造函数中分配它:

window.View = Backbone.View.extend({
    initialize: function () {
        this.mistakes_dict = { };
        this.render();
    },
    //...

mistakes_dict直接在视图上定义。

所以你需要使用this上下文来访问它

mistakes_dict[mistakes_string[i]] = 1;

应该是

this.mistakes_dict[mistakes_string[i]] = 1;