从我到目前为止所读到的内容,我们可以使用函数在javascript中创建一个具有“私有”/“公共”成员的对象。一些事情:
function foo(param1) {
this.publicVar= param1;
privateVar = "can't touch this";
this.MC = function(){
var ret = privateVar + ", " + this.publicVar;
return ret;
};
}
使用var f = new foo("hammer time");
调用时,我可以使用f.publicVar
& f.MC()
,但我无法触及privateVar
。
正如您在jsbin中所看到的,一切似乎都有效。
我没有得到的是在这种情况下使用this
。
使用this.privateVar
将是未定义的,使用不publicVar
的{{1}}将是未定义的。
这是一个更详细的例子:jsfiddle 有2个选项来创建对象,并且尊重地调用它们:
this
问题1 :
在function Option1(aX,aY) {
var x,y;
x = aX || 0; // `||` serves as guard, in case parameters
y = aY || 0; // are not defined, initializes to 0;
this.toString = function() {
var retStr = "from Option 1: I am here: <br/>"+
"x: " + x + "<br/>" + // 1
"y: " + y + "<br/>" + // 1
"this.x: " + this.x + "<br/>" + // undefined
"this.y: " + this.y + "<br/>" + // undefined
"aX: " + aX + "<br/>" + // 1
"aY: " + aY ; // 1
return retStr;
};
// `this` is returned implicitly
}
// first has only toString() as "public" member
var first = new Option1(1,1);
,toString
&amp; x
位于Chrome调试器中y
的{{1}}内,但closure
无法访问。
scope variables
问题2 :
在此this
,function Option2(aX,aY) {
var x,y;
this.x = aX || 0;
this.y = aY || 0;
this.toString = function() {
var retStr = "from Option 2: I am here: <br/>"+
"x: " + x + "<br/>" + // undefined
"y: " + y + "<br/>" + // undefined
"this.x: " + this.x + "<br/>" + // 22
"this.y: " + this.y + "<br/>" + // 22
"aX: " + aX + "<br/>" + // 22
"aY: " + aY ; // 22
return retStr;
};
}
// second has x,y & toString() as "public" members
var second = new Option2(22,22);
&amp; toString
不要出现在Chrome调试器中x
的{{1}}内,并且只能与y
一起使用。
我希望closure
能够访问scope variables
,因为它会从外部函数继承它,但如果没有this
则不可能。
任何澄清都将受到高度赞赏。欢呼声。
答案 0 :(得分:0)
在选项1中(我将仅使用一个变量进行示例)
function Option1(aX) {
var x; //defining x variable with a certain memory adress
x = aX || 0; //assigning to it a value
//in this case "this.x" doesn't exist
}
在选项2中:
function Option2(aX) {
var x;//defining x variable with a certain memory adress
this.x = aX || 0; //defining another variable with different memory address and
//assign to it the value of the passing parameter
//in this case this.x != x
}
如果我要互相学习,请纠正我,如果我错了
答案 1 :(得分:0)
我想我明白现在发生了什么,感谢 c.P.u1 &amp;的 daguru 即可。
siledh :我想我很快就会开始阅读那本书。
这是更新的 - - &gt; jsbin link&lt; - 这可能会对它有所了解。
最近来自C#,我习惯在函数中定义我的变量,所以在上面的Option2
中,x
和y
未定义的原因是因为我'我们将它们定义为私有变量。
如果我不这样做,如果我试图在没有this
的情况下使用它们,则会抛出异常,因为变量不存在(导致x is not defined
)。
将x
和y
作为全局变量,将有点隐藏问题,因为它只会说x is undefined
或回归到它的全局值,除非您理解,否则具有特定价值,可能只会造成更多混乱。
回顾:调用变量和结果:
对于函数中的“私有”变量(使用var privateVar = something;
定义)
privateVar
进行通话 - &gt;为您提供局部变量,或者如果未定义则抛出错误(本地NOR全局)this.privateVar
进行通话 - &gt;返回undefine
(因为它在对象上创建了一个?)privateVar
非可从方法外部访问对于函数中的“公共”变量(使用this.publicVar = something;
定义)
this.publicVar
进行通话 - &gt;为您提供局部变量as(if)defined publicVar
进行通话 - &gt;抛出一个ReferenceError(除非你在函数中定义了一个带有该名称的私有var,或者你有一个带有该名称的全局变量,在这种情况下,你将获得该变量。)publicVar
可从方法外部访问(使用对象)希望这可以帮助某人并为他们保留一些头发:)
答案 2 :(得分:0)
你绝对应该通过 Douglas Crockford here阅读Private Members in JavaScript
,其中解释了JavaScript中的private
和public
变量,并会解释为什么你的函数Option1
和Option2
表现得如此。