更新: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的软件项目每年都会失败!
答案 0 :(得分:3)
一种方法是在getX
内定义getY
和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());
还有其他方法,这是我眼中最简单的。
答案 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;
}