与“new”操作符无关...
在这里,您可以获得有关proto/constructor的详细解释:
http://en.wikibooks.org/wiki/JavaScript/Access_Control
然而,这只是一个无意义的例子,您可以通过getter和setter方法访问priv:
function Calculator2() {
var priv = 0;
this.public = 0;
this.getPriv = function(){
return priv;
}
this.setPriv = function(val){
priv = val;
}
}
Calculator2.prototype.changePriv = function(){
this.setPriv(this.getPriv()+1);
}
Calculator2.prototype.printPriv = function(){
console.log("priv = " + this.getPriv());
}
Calculator2.prototype.changePublic = function(){
this.public++;
}
Calculator2.prototype.printPublic = function(){
console.log(this.public);
}
在此情况下,变量 priv 始终可以通过 getter 和 setter 方法访问,
在下一个示例中,您有一个私有变量 className 和另一个公共变量 __className:
<div id = "outputDiv" style="width:600px;height:400px;border:solid 1px #000"></div>
<script type="text/javascript">
//<![CDATA[
//脚本:
var SomeClass = function(className) {
var __className__ = className;
this.__className__ = "\"public default className\"";
var someString = new String("");
this.setScopeText = function() {
someString = "A new instance of \"private [__classname__] : " +
__className__ + "\"" +
" has been created. Refering to [__className__]<br />" +
"A new instance of " +
this.__className__ +
" has been created. Refering to [this.__className__]";
return someString;
};
this.getScopeText= function (){
return someString;
}
this.setOutput = function(elementId, someString){
var outputPane = this.getSomePane(elementId);
outputPane.innerHTML += "<p>" + someString + "</p>";
}
this.getSomePane = function(elementId){
var outputP = document.getElementById(elementId);
return outputP;
}
}
SomeClass.prototype.changeClassNameVariable = function( str ){
this.__className__ = str;
}
// 结束声明。
// 测试:
var sc = new SomeClass("foo");
sc.setOutput("outputDiv",sc.__className__);
sc.setOutput("outputDiv",sc.setScopeText());
sc.setOutput("outputDiv",sc.getSomePane("outputDiv"));
sc.__className__ = "\"Some name\"";
sc.setOutput("outputDiv",sc.__className__);
sc.setOutput("outputDiv",sc.setScopeText());
sc.changeClassNameVariable("bar");
sc.setOutput("outputDiv",sc.__className__);
sc.setOutput("outputDiv",sc.setScopeText());
// 结束 JavaScript 和 CDATA 部分
//]]>
</script>
在 "div:outputDiv" 中输出:
"public default className"
已创建一个新的实例 "private [classname] : foo",引用 [className]
已创建一个新的实例 "public default className",引用 [this.className]
[object HTMLDivElement]
"Some name"
已创建一个新的实例 "private [classname] : foo",引用 [className]
已创建一个新的实例 "Some name",引用 [this.className]
bar
已创建一个新的实例 "private [classname] : foo",引用 [className]
已创建一个新的实例 "bar",引用 [this.className]
-> 在构造函数中声明的 className 永远不会改变!
-> this.className 或 SomeClass.prototype.className 是公共的,可以更改。
我希望这可以更清楚地理解链和我的注释...
new
调用的函数)。Calculator
函数明确返回一个对象,因此使用new
调用它对其返回值没有任何影响。 - RobG