javascript:字段vs get方法

javascript:字段vs get方法,javascript,coding-style,Javascript,Coding Style,我是一名经验丰富的软件开发人员,精通多种语言。我喜欢C++/C#等强类型语言。对于JS,我只知道一些事情,对最佳实践没有很好的理解 现在我正在实现一些功能,出于教育目的,我开始在JavaScript中使用“类”。我的一个类如下所示: function Position(id, name, posX, posY) { this._id = id; this._name = name; this._poxX = posX; this._posY = posY; } v

我是一名经验丰富的软件开发人员,精通多种语言。我喜欢C++/C#等强类型语言。对于JS,我只知道一些事情,对最佳实践没有很好的理解

现在我正在实现一些功能,出于教育目的,我开始在JavaScript中使用“类”。我的一个类如下所示:

function Position(id, name, posX, posY) {
    this._id = id;
    this._name = name;
    this._poxX = posX;
    this._posY = posY;
}
var positions = [
    new Position(0, " ", 0, 190),
    new Position(1, "GK", 68, 170),
    new Position(2, "LB", 25, 155),
    new Position(3, "SW", 68, 150),
    new Position(4, "RB", 111, 155),
    ...
];
我计划使用对象的方式如下:

    for (var j = 0; j < positions.length; j++) {
        var posJ = positions[j];
        posControl.append(new Option(posJ._name, posJ._id));
    }
这种方式不仅提供getter/setter,还使变量私有

我想把这个写进“答案”,但问题被搁置了


p.p.S.可能,问题应该改为“如何使类成员私有化”,但在撰写问题时,我确信这在JS中是不可能的:)

我担心你可能会在古典继承的土地上陷入思考,而你应该思考原型

我想快速消除Javascript解决方案被称为“黑客”的概念。我不是想装腔作势,只是当你把被接受的解决方案看作是一种妥协时,你永远不会完全理解当初为什么选择它

简而言之,您的代码似乎很好。getter和setter只适用于类/对象的私有成员,您可以在javascript中使用闭包实现它们。如果您同意将.\u name和.\u id作为任何其他变量进行访问,那么您的代码似乎很好

但是,如果您想实现允许对.\u name属性进行只读访问的功能,那么您可以编写

function Position(name) {
  this.getName = function() {
    return name;
  };
}

pos = new Position('harry');
if (pos.getName() == 'harry') {
  console.log('Private member access!'); // will print
}

如何实现这一点是您的选择,取决于代码的用途。希望以上内容能为您提供一些关于如何构造类的想法,但请仔细研究原型继承和闭包,它们在正确使用时具有难以置信的强大功能。

为简化代码,请将它们作为公共属性保留。但是getter/setter给了您更多的灵活性,因为您可以在将值移交给调用方之前进行处理。这是你的决定。你是唯一可以决定是否可以公开访问数据的人。有些人喜欢在“Hand-off”属性名称前加上一两个下划线。如果他们愿意,可能更适合codereview.se。
function Position(name) {
  this.getName = function() {
    return name;
  };
}

pos = new Position('harry');
if (pos.getName() == 'harry') {
  console.log('Private member access!'); // will print
}