何时更好地在对象上定义属性,或者将局部变量作为参数传递?
简化示例:
var obj = function(){
this.method_1 = function(){
this.var_1 = 1;
this.method_2();
};
this.method_2 = function(){
//Access var_1
var_3 = this.var_1 * 2;
};
};
与
var obj = function(){
this.method_1 = function(){
var var_1 = 1;
this.method_2(var_1);
};
this.method_2 = function(var_1){
//Access var_1
var_3 = var_1 * 2;
};
};
重要吗?
编辑:我之前应该提到这个,但仍然是:
我的情况是Google Map实例是由mapPresenter对象上的方法创建的;此方法仅在被特定事件触发后执行。虽然我不需要从外部访问地图实例,但我在presenter对象本身的许多方法中使用它,这将使它更容易"在presenter对象上设置属性。
答案 0 :(得分:3)
只有当您需要从外部访问它,并且该值在逻辑上是实例的一部分时,它才应该是属性。如果它只是调用所需的值,那么您应该使用方法参数。您在方法调用中创建属性,而不是在实例化(在构造函数中)应该作为警告气味。
function Obj() {
this.var_1 = 1;
this.method = function() {
return this.var_1 * 2;
};
}
var o = new Obj;
console.log(o.var_1);
console.log(o.method());
与
function Obj() {
this.method = function(var_1) {
return var_1 * 2;
};
}
var o = new Obj;
console.log(o.method(1));
答案 1 :(得分:0)
我会加2美分。这只是您希望从对象外部访问的内容的问题
两种方法都可访问,属性无法访问
var obj = function(){
var var_1 = 1;
var var_3;
this.method_1 = function(){
this.method_2();
};
this.method_2 = function(){
var_3 = var_1 * 2;
};
};
甚至
只有一种方法可访问,属性无法访问
var obj = function(){
var var_1 = 1;
var var_3;
this.method_1 = function(){
method_2();
};
function method_2 (){
var_3 = var_1 * 2;
};
};
甚至
一种方法可访问,两种属性都可以访问
var obj = function(){
this.var_1 = 1;
this.var_3;
this.method_1 = function(){
method_2();
};
function method_2 (){
this.var_3 = this.var_1 * 2;
};
};
等...
答案 2 :(得分:0)
没有正确的答案,但这里需要考虑的事情:
一旦method_1完成,var_1对obj意味着什么?或者var_1只是对计算的帮助。
我希望保持数据模型的正常形式。如果var_1是另一个对象的属性,那么也不要将它存储在obj中,考虑直接在obj中创建对另一个对象的引用,(obj.related.var_1)。
如果要在内存中构建多个obj,将var_1作为参数传递会减少内存占用。
我猜method_1可以改写为 method_1 = bind(obj,1);
此外,将method_1和method_2添加到原型中,因此只创建了一个函数实例。
答案 3 :(得分:0)
主要区别在于值的持久性和对象的状态。
将var_1
用作属性表示该值将一直保留,直到更改为止。正如其他人所说的那样,这意味着它可以在对象外部访问,也可以在以后访问。但是,因为它是持久的,所以需要更多内存,并且可能导致内存泄漏(如果var_1
足够复杂,例如obj的另一个实例)。
使用var_1
作为参数表示在函数完成后它将丢失。因此,它不能在对象外部访问,也不会导致内存泄漏。但是,调试起来比较困难。
通常,属性表示对象的状态,而参数提供有关如何操作的信息。问问自己,你需要再次var_1
吗?如果这样做,将其存储为属性是合理的。如果没有,请坚持认为。
在非Javascript语言中,参数路由更适合多线程行为,因为属性可以在没有警告的情况下更改。
对于它的价值,这是第三种选择,它将var_1作为私有财产
//var_1 persisted but not publicly available
var obj = function(){
var var_1;
this.method_1 = function(){
var_1 = 1;
this.method_2();
};
this.method_2 = function(){
//Access var_1
var_3 = var_1 * 2;
};
};