在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中,他使用了value
和val
两个不同的名称。
在这个链接。Best practice for parameter naming in Java constructors and simple setters我看到,参数命名没有约定。
我的个人偏好是1,但我将被迫使用,this.pos
并且也有风险。
所以,是1还是2或3或0(我目前的方式)。哪一个最好?
答案 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或单身时。