我有一个简单的Javascript类,我正在尝试制作它,直到我遇到一个似乎不应该发生的问题。我有以下课程:
function circle(paper) {
var x = null;
var y = null;
var r = null;
var x1 = null;
var y1 = null;
var R = 0;
this.G = 0;
this.B = 0;
this.lineSize = 1;
this.paper = paper;
var that = this;
this.set = function(x,y,r){
that.x = x;
that.y = y;
that.r = r;
}
this.colorOut = function(){
console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
}
}
现在,无论我做什么,R都会被定义,但是如果我做var R = null;
并且在集合中{I}突然定义了that.R = 0;
。然而,根据我在crockford网站上发现的许多SO帖子链接到这些问题,似乎他正在做我正在做的事情并且它正在发挥作用。如下面的代码所示:
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
this.service = function () {
return dec() ? that.member : null;
};
}
现在,有什么我在这里不理解,或者是误解?我是JS中的类如何工作的新手,我更习惯于Java / C ++类。无论如何,如果你需要更多信息的话问!非常感谢!
答案 0 :(得分:5)
之间存在很大差异
var R;
和
this.R = something;
第一个是局部变量声明。它不会向任何对象添加属性。变量将在与对象属性关联的任何函数内可见,因为函数是在该构造函数内创建的。变量“R”是函数实例化时形成的闭包的一部分。
第二个在正在构建的对象上建立一个名为“R”的属性。
编辑 - 进一步澄清:
this.colorOut = function(){
console.log("R: "+that.R+" G: "+this.G+" B: "+this.B);
}
在该函数中,您将“R”称为构造对象的属性;那是that.R
的意思。当你所有的都是var R;
声明时,对象上就没有这样的属性。但是有一个局部变量,所以你可以改变功能:
this.colorOut = function(){
console.log("R: " + R + " G: "+this.G+" B: "+this.B);
}
你会看到局部变量“R”的值,无论它是什么。 (如果你没有初始化它,那么无论如何它都是undefined
。)