<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function Peon(number) {
this.number = number;
this.inc = function() {
number=number+1;
};
return true;
}
var p=new Peon(10);
function returnNumber() {
p.inc();
alert(p.number);
}
</SCRIPT>
</HEAD>
<BODY>
<INPUT id="b00" TYPE="button" Value="Click" onClick="returnNumber()">
</BODY>
</HTML>
此代码无法正常工作。有没有办法让它工作而不必写
this.number=this.number+1;
这是一个微不足道的选择,但是在更大的代码中没有这个。*会使它更具可读性。有可能吗?
答案 0 :(得分:2)
您可以将number
设为“私有”,但是您需要 getter :
function Peon(number) {
var number = number;
// increment
this.inc = function() {
number++;
};
// a simple getter
this.getNumber = function() {
return number;
}
}
var p = new Peon(10);
p.inc();
alert(p.getNumber());
你应该阅读Douglas Crockfords的“The Good Parts”,了解如何使用这种模式的更多信息,Google Books提供(有限的)预览。
此外,您不需要从构造函数返回任何内容,return true
是多余的。
答案 1 :(得分:1)
不,您必须使用this
来引用this
对象上的属性。请注意,JavaScript中的this
与其他一些语言(如C或Java)中的this
非常不同。更多here和here。
您的代码正在执行的是访问传递给number
构造函数的Peon
参数,而不是您在构造函数中创建的this.number
属性。这就是为什么它不能按预期工作,但也不会失败。
没有理由在 inc
构造函数BTW中定义Peon
操作,并且没有理由(通过{{1}创建的每个单独对象)将获得该函数的自己的副本。相反,你可以这样定义它:
Peon
答案 2 :(得分:0)
不是,但这更简洁
this.number++
实际上,作为旁注,你最好在Peon的构造函数之外声明.inc。你可以用原型做到这一点。这样,每次创建Peon类型的对象时都不会重建inc函数。
Peon.prototype.inc = function(){
this.number++;
}
或者您可以p.inc()
使用p.number++
而不是{{1}}。这是我能想到避免使用此关键字的唯一方法。
答案 3 :(得分:0)
我能看到的唯一可读方式是:
this.inc = function() {
this.number++;
};
否则,在你的“更大代码”假设中,你可以这样做:
this.inc = function() {
var number = this.number; // obviously simple here. Imagine more complexity
number++;
};
答案 4 :(得分:0)
是的,你不需要在javascript中使用'this'。您可以通过闭包而不是'this'
来访问变量
function createPeon(number) {
function inc() {
number=number+1;
};
function getNumber() {
return number;
}
return { inc, getNumber };
}
var p=createPeon(10);
p.inc();
alert(p.getNumber());