「新しい」オペレータとは何の関係もありません...ここでは、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);
}
この場合、var priv は getter メソッドと setter メソッドを介して常にアクセスできます。
次の例では、プライベート var classNameと別のパブリック var __className があります。
<div id = "outputDiv" style="width:600px;height:400px;border:solid 1px #000"></div>
<script type="text/javascript">
//<![CDATA[
//script : var SomeClass = function(className) {
var __className__ = className;
this.__className__ = "\"public default className\"";
var someString = new String("");
this.setScopeText = function() { // void
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" の出力:
「パブリック デフォルト クラス名」
"private [ classname ] : foo"の新しいインスタンスが作成されました。[ className ] の参照 "public default className" の新しいインスタンスが作成されました。【こちらを参考に。クラス名]
[オブジェクト HTMLDivElement]
「ある名前」
"private [ classname ] : foo"の新しいインスタンスが作成されました。[ className ] を参照 「ある名前」の新しいインスタンスが作成されました。【こちらを参考に。クラス名]
バー
"private [ classname ] : foo"の新しいインスタンスが作成されました。[ className ] の参照 bar の新しいインスタンスが作成されました。【こちらを参考に。クラス名]
->コンストラクタで宣言されたclassNameは変更されません! →これ。classNameまたは SomeClass.prototype. classNameは公開されており、変更される可能性があります。
これがチェーンと私のコメントをより明確に理解するのに役立つことを願っています...