&引用;“私人”;在Javascript中
我很难确定JS中“局部”作用域的某些属性是什么以及如何定义的。当属性_secretNum在构造函数范围外明显可用时,它是如何“私有”的,如下行所示&引用;“私人”;在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>
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
内,您不能访问代码中的任何地方的私有文件。