我想要一种实例化和更新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();
}
[...]
是否有更好的方法来设置和覆盖默认值?
使用这种方法时,我总是必须为所有变量使用“options”前缀,是否有更清晰的解决方法?
在上面的示例中,_defaults.xAxis和_defaults.yAxis实际上是从其他变量派生的。这些应该放在_defaults对象里面还是放在哪里? (我不想跟踪哪些变量是“派生选项”而不是......)
3)编辑: 我的意思是对象属性不应该在构造函数中被覆盖,而是根据其他属性进行更新。
不使用$ .extend我做了类似的事情:
var a,b; var c;
构造(A,B) this.a = a; this.b = b;
this.c = a + b;
我只是想知道将c放在默认值中是否有问题......
答案 0 :(得分:0)
这种方法会出现问题,因为“$ .extend()”会覆盖第一个参数的内容。对于“默认值”,这将是坏事: - )
this.options = $.extend({}, this._defaults, options);
这是避免问题的正常方法:传入一个全新的空对象作为第一个参数,然后首先使用所有默认值填充,然后使用传入的任何内容来覆盖这些值。
通过“选项”句柄“不得不”引用变量并不是一个好方法。您可以制作本地副本,虽然这在本地意义上是无害的,但它可能会引入错误。
编辑 - 现在好了,我明白了你的意思(3),我认为我会做的是在之后计算那些属性你扩展了默认值。这样,即使客户端代码传递的内容确实不应该存在,您只需用合法的值覆盖它。
所以,比如:
this.options = $.extend({}, this._defaults, options);
this.options.something = someFunction();
this.options.somethingElse = whatever();