声明为对象属性vs传递为参数

时间:2015-07-07 17:01:41

标签: javascript

何时更好地在对象上定义属性,或者将局部变量作为参数传递?

简化示例:

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对象上设置属性。

4 个答案:

答案 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; 
    }; 
};