我是经验丰富的软件开发人员,并且知道大量的语言。我的爱强烈输入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));
}
对我来说,JS知道很多“黑客”(比如分配方法),我绝不会在C ++或C#中写过这样的东西,但在JS中......
问题:我应该为“_name”和“_id”这样的字段创建getter,还是在JS中可以公开访问它们并按照我的计划使用?
非常欢迎任何有关JS代码风格的建议!
非常感谢您的反馈!
P.S。在获得一些经验后,我已经找到了正确的方法:
function Position(id, name, posX, posY) {
var _id = id;
var _name = name;
var _poxX = posX;
var _posY = posY;
this.getId = function () { return _id; };
this.getName = function () { return _name; };
}
这种方式不仅提供了getter / setter,还使变量变为私有。
我会把它放到“答案”中,但问题被搁置了。
P.P.S。可能问题应该改为“如何让班级成员私有”,但在撰写问题的那一刻,我确信在JS中这是不可能的:)
答案 0 :(得分:1)
当你应该思考原型时,我担心你可能会被困在古典遗产的土地上。
我想快速消除Javascript解决方案被称为'hacks'的概念。我并不是想要迂腐,只是当你把接受的解决方案视为妥协时,你就永远不会完全理解为什么它首先被选中了。
简而言之,您的代码似乎很好。 Getter和setter只对组/对象的私有成员使用才有意义,你可以在带有闭包的javascript中实现。如果你可以使用._name和._id作为任何其他变量访问,那么你的代码似乎没问题。
但是,如果您希望实现允许对._name属性进行只读访问的内容,那么您可以编写...
function Position(name) {
this.getName = function() {
return name;
};
}
pos = new Position('harry');
if (pos.getName() == 'harry') {
console.log('Private member access!'); // will print
}
您可以选择如何实现此功能,并且取决于代码的用途。希望上面给出了一些关于如何构建类的想法,但是看看原型继承和闭包,它们在正确使用时非常强大。