JavaScript中构造函数参数的命名约定

时间:2013-07-30 18:56:59

标签: javascript constructor naming-conventions

在javascript中,我喜欢。,

0。目前的命名方式:

Cell = function(position){
   //Constructor.
   var pos = position;


   //Many Sub-functions using variable `pos` here through out this function Cell.
}

但在java / C ++中,我可以编写与。,

相同的内容
   Cell(int pos){
    this.pos = pos; 
   }

建议的命名方式:

1。关于this.pos = pos
在javascript中我也可以像this.pos = pos一样,它会起作用。但问题是。, 然后通过程序,我必须访问我的位置this.pos。,并且它在分配时有危险,因为当我指定像this.Pos = 7(错误的情况)时,它不会显示错误。所以这种方法不可取。

2。关于pos = _pos

Cell = function(_pos){
       //Constructor.
       var pos = _pos;

但一般来说,在C ++ / Java中我不会用这种方式,所以最好不要这样做。

第3。通过函数将构造函数的参数用作变量。

Cell = function(pos){

我可以使用这个pos,通过我的功能,但我怀疑我是否能做到这一点。因为,我需要使用构造函数,setter,getter等以适当的面向原型的方式执行此操作...此外,在John resign link中,他使用了valueval两个不同的名称。

在这个链接。Best practice for parameter naming in Java constructors and simple setters我看到,参数命名没有约定。

我的个人偏好是1,但我将被迫使用,this.pos并且也有风险。

所以,是1还是2或3或0(我目前的方式)。哪一个最好?

1 个答案:

答案 0 :(得分:0)

老实说,我只是选择this.pos = pos;并依赖文档来了解它是一个不应被访问的私有成员。我也看到有些人为此目的使用_前缀,例如this._pos = pos;。将所有实例变量设置为“私有”的问题在于,您牺牲了原型继承的所有好处,因为必须在构造函数内声明函数以创建对这些函数的闭包。这意味着函数不会通过prototype在实例之间共享,而是每次都作为直接实例成员重新创建。

让所有成员公开并不会阻止您创建和使用setter,但您需要依赖标准而不是强制实施隐私。

function Cell(pos) {
    this.setPos(pos);
}

Cell.prototype.setPos = function (pos) {
    if (typeof pos !== 'number') {
         throw 'pos has to be a number';
    }

    this.pos = pos;
};

让我们与强制执行进行比较:

function Cell(pos) {
    //note that we use value to avoid shadowing the closed-over pos variable
    this.setPos = function (value) {
        if (typeof pos !== 'number') {
             throw 'pos has to be a number';
        }

        pos = value;
    };

    this.getPos = function () {
        return pos;
    };

    this.setPos(pos);
}

虽然这可以确保访问者无法被绕过,但在我看来,它会导致丑陋且非常低效的代码。但是,有一些有效的案例可以使用类似的方法,例如写modules或单身时。