Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“私人”;在Javascript中_Javascript_Oop_Private Members - Fatal编程技术网

&引用;“私人”;在Javascript中

&引用;“私人”;在Javascript中,javascript,oop,private-members,Javascript,Oop,Private Members,我很难确定JS中“局部”作用域的某些属性是什么以及如何定义的。当属性_secretNum在构造函数范围外明显可用时,它是如何“私有”的,如下行所示 document.write("Value of secretNum in secret: " + secret._secretNum + "<br/>"); document.write(“secretNum的秘密值:+secret.\u secretNum +“”; 完整代码如下: <body>

我很难确定JS中“局部”作用域的某些属性是什么以及如何定义的。当属性_secretNum在构造函数范围外明显可用时,它是如何“私有”的,如下行所示

document.write("Value of secretNum in secret: " + secret._secretNum
            + "<br/>");
document.write(“secretNum的秘密值:+secret.\u secretNum
+“
”;
完整代码如下:

<body>
<script type="text/javascript">
    function SecretCode() {
        var _secretNum = 78;

        this.guessNum = function(num) {
            if (num > _secretNum) {
                return "Lower";
            } else if (num < _secretNum) {
                return "Higher";
            } else {
                return "You guessed it";
            }
        }

        this.setNum = function(newNum) {
            this._secretNum = newNum;
        }

        this.getNum = function() {
            return this._secretNum;
        }
    }

    var secret = new SecretCode();

    for ( var prop in secret) {
        document.write(prop + " : " + secret[prop] + "<br/>");
    }

    document.write("Is 70 the number: " + secret.guessNum(70) + "<br/>");
    secret.setNum(9);
    document.write("Value of secretNum in secret: " + secret.getNum()
            + "<br/>");
    document.write("Value of secretNum in secret: " + secret._secretNum
            + "<br/>");

    var secretAliter = new SecretCode();
    secretAliter.setNum(17);
    document.write("Value of secretNum in secretAliter : "
            + secretAliter.getNum() + "<br/>");
    document.write("Value of secretNum in secretAliter : "
            + secretAliter._secretNum + "<br/>");
</script>
</body>

函数SecretCode(){
var _secretNum=78;
this.guessNum=函数(num){
如果(num>\u secretNum){
返回“较低”;
}否则如果(数值<_secretNum){
返回“更高”;
}否则{
返回“你猜对了”;
}
}
this.setNum=函数(newNum){
这个._secretNum=newNum;
}
this.getNum=函数(){
将此返回。\u secretNum;
}
}
var secret=new SecretCode();
for(秘密中的var prop){
文件。写(prop+“:“+秘密[prop]+”
); } 写下(“70是数字:”+secret.guessNum(70)+“
”; 秘密。setNum(9); document.write(“secretNum在secret中的值:+secret.getNum() +“
”; 文档。写入(“秘密中secretNum的值:”+secret.\u secretNum +“
”; var secretaiter=new SecretCode(); 第二名:setNum(17); document.write(“secretiter中secretNum的值:” +secretaiter.getNum()+“
”); document.write(“secretiter中secretNum的值:” +secretariter._secretNum+“
”;
该地产如何“私有化”

不是,我不知道你从哪里得到的密码,但它坏了

var\u secretNum=78
声明的局部变量是私有的,但它也被
setNum
getNum
访问器方法忽略。他们使用的是
this.\u secretNum
,这是一个完全不同的非私有变量,与
var\u secretNum=78
行无关。您可以直接或通过使用
setNum
更改
this.\u secretNum
的值,它不会影响
guessNum
使用的变量
\u secretNum

var\u secretNum
声明为构造函数中的局部变量的要点是,它只能在该函数中访问,并且只能由返回时“关闭”它的函数访问。从访问者中删除
this.\u secretNum
,只需使用
\u secretNum

举例来说:

function MyConstructor() {
  var _name = "bob"  // Completely private

  this._age = 45     // Not private

  this.getName = function () {
    return _name     // public accessor for private variable
  }

  this.getAge = function() {
    return this._age // public accessor for public property
  }
}


var x = new MyConstructor();
x._name = "blah"    // unrelated, ignored by getName
alert(x.getName())  // bob, not "blah"
x._age = 25         // overwrite age
alert(x.getAge())   // 25

根据惯例,它是私有的,但它的隐私不受强制执行。财产不具有或不属于任何范围。属性和变量是两个不同的东西。我希望您在看到完整代码之前已经看过第一个代码段,而不是将答案局限于getter和setter方法。至少有2个doc.write在没有getter的情况下访问所谓的“private”变量。@VedVrat不,没有,请重新阅读我的答案。没有一个doc.write可以访问私有变量。同样,这里有两个变量,每一个你认为你正在访问私有变量的实例,你都没有。您的document.writes调用access
secretariter.\u secretNum
secret.\u secretNum
这两个变量与私有变量不同。这些属性是公共的,它们与私有变量完全无关。私密的那一个是不可接近的。除了在
guessNum
内,您不能访问代码中的任何地方的私有文件。