【发布时间】:2014-01-27 13:41:41
【问题描述】:
根据我目前所读到的内容,我们可以使用一个函数在 javascript 中创建一个具有“private”/“public”成员的对象。顺带一提:
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 而不使用this 将是未定义的。
这是一个更详细的示例:jsfiddle。
有 2 个选项来创建对象,并尊重地调用它们:
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);
问题 1:toString 内部,x 和 y 出现在 chrome 调试器中 scope variables 中的 closure 内部,但无法通过 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);
问题 2:
在这个 toString、x 和 y 内部 不要 出现在 chrome 调试器中 scope variables 的 closure 内部,并且只能通过 this 访问。
我希望Option2 能够访问x,因为它会从外部函数继承它,但如果没有this,这是不可能的。
任何澄清将不胜感激。干杯。
【问题讨论】:
-
您可以通过“特权方法”访问私有变量。(来自 Douglas Crockford)
-
有什么问题?
-
MDN 有一个相当广泛的概述:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
-
在
Option1,为什么我不能用this.x,在Option2为什么我不能用x? -
我认为这更多是 Chrome 开发工具问题(或误用),您的概念很好。
标签: javascript scope closures