清理实例化和更新JavaScript对象的方式? (我的方法有效吗?)

时间:2011-08-28 14:51:28

标签: javascript jquery object javascript-framework instantiation

我想要一种实例化和更新JavaScript对象的简洁方法 现在我正在使用这种方法:

myApp.chart.GridController = Backbone.Base.extend({

    _defaults : {

        width : 500,
        height : 500,
        indicatorXMin : 100,
        indicatorXMax : 10000, 
        indicatorXScale : "log",

        xScale : undefined,
        yScale : undefined,

        xAxis : undefined,
        yAxis : undefined,

        element : undefined,

    },

    options : {},

    constructor: function (options) {
        this.options = $.extend(this.options.defaults, options);
        this.render();
    },

    update : function(options) {
        this.options = $.extend(this.options, options);
        this.render();
    },

    render : function(){
        this.updateAxes();
        this.draw();
    }

[...]   
  1. 是否有更好的方法来设置和覆盖默认值?

  2. 使用这种方法时,我总是必须为所有变量使用“options”前缀,是否有更清晰的解决方法?

  3. 在上面的示例中,_defaults.xAxis和_defaults.yAxis实际上是从其他变量派生的。这些应该放在_defaults对象里面还是放在哪里? (我不想跟踪哪些变量是“派生选项”而不是......)


  4. 3)编辑: 我的意思是对象属性不应该在构造函数中被覆盖,而是根据其他属性进行更新。

    不使用$ .extend我做了类似的事情:

    var a,b; var c;

    构造(A,B) this.a = a; this.b = b;

    this.c = a + b;

    我只是想知道将c放在默认值中是否有问题......

1 个答案:

答案 0 :(得分:0)

这种方法会出现问题,因为“$ .extend()”会覆盖第一个参数的内容。对于“默认值”,这将是坏事: - )

    this.options = $.extend({}, this._defaults, options);

这是避免问题的正常方法:传入一个全新的空对象作为第一个参数,然后首先使用所有默认值填充,然后使用传入的任何内容来覆盖这些值。

通过“选项”句柄“不得不”引用变量并不是一个好方法。您可以制作本地副本,虽然这在本地意义上是无害的,但它可能会引入错误。

编辑 - 现在好了,我明白了你的意思(3),我认为我会做的是在之后计算那些属性你扩展了默认值。这样,即使客户端代码传递的内容确实不应该存在,您只需用合法的值覆盖它。

所以,比如:

    this.options = $.extend({}, this._defaults, options);
    this.options.something = someFunction();
    this.options.somethingElse = whatever();