0

更新: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 的软件项目失败!?

4

3 回答 3

3

一种方法是定义getXgetY内部Model而不是原型。

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());

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

于 2012-06-25T15:48:33.150 回答
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 是非常不同的。更喜欢约定(比如调用以_开头的私有字段)而不是试图强制隐私。

于 2012-06-25T15:39:53.123 回答
-2

您将需要使用this

Model.prototype.getX = function() {
    return this.x;
}
于 2012-06-25T16:13:29.037 回答