【问题标题】:What is the pattern for setting attributes on Backbone.js' Models and Views?在 Backbone.js 的模型和视图上设置属性的模式是什么?
【发布时间】:2012-07-11 18:09:14
【问题描述】:

我是 Javascript 框架领域的新手,我非常喜欢 Backbonejs 的工作方式。 但是我有一个关于模型和视图的构造函数的问题。我多年来一直使用类似 Java 的语言进行开发,并且习惯于这样定义构造函数:

public Car(Manufacturer manufacturer, String model, Color color) {
    this.manufacturer = manufacturer;
    this.model = model;
    this.color = color;
}

但我在文档和其他教程中看到,人们在定义模型或视图时通常不会声明特定的构造函数,他们只是像这样构造对象:

var car = new Car({manufacturer: ford, model: "Mustang", color: "red"});

这样定义构造函数是错误的还是“丑陋的”:

window.Car = Backbone.Model.extend({
    initialize: function(manufacturer, model, color) {
        this.manufacturer = manufacturer;
        this.model = model;
        this.color = color;
    }
});

如果是这样,你能解释一下原因吗? 我真的希望这不是一个愚蠢的问题,我没有找到任何相关的问题。

【问题讨论】:

  • 这不是 Java。不要期望它遵循完全相同的语法。
  • 感谢您的评论!实际上,我不希望有相同的语法,我只想知道什么是正确/最好的方法,一旦两者都可能。
  • 如果你以这种方式定义你的类,在创建CarModel 的实例时你是否可以访问initialize?
  • 对不起 MilkyWayJoe,我不明白你的问题。

标签: javascript oop design-patterns backbone.js


【解决方案1】:

传递多个参数而不是对象的想法很好,但是您希望初始化函数看起来像这样:

window.Car = Backbone.Model.extend({
    initialize: function(manufacturer, model, color) {
        this.set({
            manufacturer: manufacturer,
            model: model,
            color: color
        });
    }
});

您需要使用set 来访问属性对象。通过使用this,您将属性直接附加到模型。

主干使用属性对象的原因是当你改变属性时它可以自动触发事件。这也是一种将字段封装在方法中的方法,就像创建方法一样

private Manufacturer manufacturer;

和

public Manufacturer getManufacturer()

在java中。

【讨论】:

  • 谢谢格雷格·吉达!这样我就不会觉得我在破坏某些东西。
【解决方案2】:

这类似于将上下文对象传递给 Java 中的方法(在无状态环境中需要将一些状态传递给方法时完成)。碰巧该方法是一个构造函数。我认为这没有特定的官方模式。这是 javascript 中的常见范例。

【讨论】:

  • 感谢您的回答 hvgotcodes!但是我看到,如果我将 initialize 定义为带有 function(man,model,color) 之类的参数的构造函数并使用 this 变量来定义模型属性,我将无法使用 get访问这些属性> 模型的方法,但我可以直接访问属性car.model。是否有任何影响,例如。在模型属性的主干事件中,取决于我定义这些属性的方式?
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多