javascript:fields vs get方法

时间:2013-12-24 02:38:54

标签: 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;
}
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中这是不可能的:)

1 个答案:

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

您可以选择如何实现此功能,并且取决于代码的用途。希望上面给出了一些关于如何构建类的想法,但是看看原型继承和闭包,它们在正确使用时非常强大。