在JavaScript中正确的'私有'变量初始化

时间:2012-06-25 15:38:20

标签: javascript constructor

更新:2012.06.26 - 请参阅我原来的问题后的结论。

我试图弄清楚为什么这个简单的代码没有正确初始化。是的,我来自Java世界,我也是一个'纯粹主义者',并且想要正确地使用JavaScript。

许多(如果不是全部)将建议声明前缀为'this'关键字的变量,从而暴露所有这些变量而不使用正确的setter和getter函数。对我来说,这是不可接受的,并不能反映出良好的OOP实践。他们说JavaScript是一种OOP语言,所以为什么人们总是试图绕过这个我永远不会理解的东西!?但这不是问题,所以让我们继续......

以下代码的问题在于,当我在Chrome中运行它时,它会一直告诉我:

Uncaught ReferenceError: x is not defined

我可以创建一个接受默认值的构造函数,但是我不想暴露构造对象的那些默认值(这也不是好习惯)。此外,在运行时,将调用setter方法来更改特定实例的“x”和“y”值。有很多“模型”实例可以同时使用!

所以这是简单的代码:

function Model() {
    var x = 3;
    var y = 'hello';
}

Model.prototype.getX = function() {
    return x;
}

Model.prototype.getY = function() {
    return y;
}

Model.prototype.setX = function(myX) {
    x =  myX;
}

Model.prototype.setY = function(myY) {
    y =  myY;
}

var model = new Model();

console.log("Model Y = '" + model.getY() + "'");
console.log("Model X = " + model.getX());
console.log("Model Y = '" + model.getY() + "'");

感谢您的帮助......

问题的结论(2012.06.26更新):

很容易得出结论,使用JavaScript无法完成所请求的内容(恰好是这么简单)!

令我极为惊讶的是,从下面的答案中可以看出,有些人会争辩说,既然JavaScript不支持它,那么你就不应该需要它或使用它。哇,这太棒了!

我多年来一直认为JavaScript不是一种OOP语言,这个简单的问题(以及它的答案)就是证明它。

所以最后它讨论了我承认失败,你和我都需要改变我们的代码,为所有班级成员使用'this'关键字。再一次,语言控制程序员而不是控制语言的程序员!他们想知道为什么超过2/3的软件项目每年都会失败!

3 个答案:

答案 0 :(得分:3)

一种方法是在getX内定义getYModel,而不是原型。

function Model() {
    var x = 3;
    var y = 'hello';
    this.getX = function(){return x;}
    this.getY = function(){return y;}
    this.setX = function(val){x=val;}
    this.setY = function(val){y=val;}
}

var foo = new Model();
console.log(foo.getX());

还有其他方法,这是我眼中最简单的。

答案 1 :(得分:2)

function Model() {
    var x = 3;
    var y = 'hello';
}

这会创建一个本地(无用)变量x,但您需要新创建的Model实例的属性。

使用

  function Model() {
    this.x = 3;
    this.y = 'hello';
}

Model.prototype.setY = function(myY) {
    y =  myY;
}

这不会改变您的财产。使用

Model.prototype.setY = function(myY) {
    this.y =  myY;
}

是的,javascript和java非常不同。更喜欢约定(比如调用以_开头的私有字段),而不是试图强制实施隐私。

答案 2 :(得分:-2)

您需要使用this

Model.prototype.getX = function() {
    return this.x;
}