与 JAVA 不同,Javascript 在属性或方法上没有私有和公共的概念。让我们创建一个名为 person 的对象,它有 2 个属性 firstName 和 lastName,并创建 2 个函数,它们将作为我们的属性的 getter。在 Javascript 中,我们可以将函数创建为对象的属性,并且这些函数可以像任何其他属性一样在任何地方访问。
var person={
"firstName":"Anoop",
"lastName":"Rai",
"getFirstName":function(){
return this.firstName;
},
"getLastName":function(){
return this.lastName;
}
};
console.log(person.getFirstName());
console.log(person.firstName);
正如预期的那样,上面的代码 11 打印出 Anoop 和 Anoop。嗯,这对面向对象的编程不好。好吧,我们成功地实现了 getter,所以我们还应该有应该是公共范围的 setter,并且属性应该标记为私有范围(什么???这些私有和公共概念属于 JAVA、C++ 之类的语言)。我们的意图是好的,让我们应用特定于 Javascript 的概念。我们不想做 person.firstName,我们想要直接阻止对属性的访问。在像 JAVA 这样的语言中,由于私有和公共,我们实现了对属性的受控访问,但在 Javascript 中,一切都是公共的。
Javascript 使用闭包的概念来实现私有和公共之类的东西。这种模式称为模块模式。也就是说,对公共访问隐藏变量。为了实现作用域,请将您的代码包装在一个函数中(请记住,作用域是通过 Javascript 中的函数实现的)。
function createPerson(){
var returnObj={
"firstName":"Anoop",
"lastName":"Rai",
"getFirstName":function(){
return this.firstName;
},
"getLastName":function(){
return this.lastName;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
console.log(person.firstName);
现在也在上面的行打印 Anoop 和 Anoop。仍然没有成功。只要属性与对象绑定,就可以直接访问它。让我们解开它。我们创建函数范围的变量(闭包变量)而不是属性。
function createPerson(){
var firstName="Anoop";
var lastName="Rai";
var returnObj={
"getFirstName":function(){
return firstName;
},
"getLastName":function(){
return lastName;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
console.log(person.firstName);
Now above lines prints Anoop and undefined. How does this happen? Because of closures, when the functions getFirstName and getLastName was created the functions had the whole scope chain or say pointers to the relevant variables i.e. firstName and lastName. The object returnObj does not remember the variabes but the function objects remembers, because of closures. Looks like we achieved what we wanted to, but one thing is left and that is setters for the controlled access of firstName and lastName. Let’s implement setters.
function createPerson(){
var firstName="Anoop";
var lastName="Rai";
var returnObj={
"getFirstName":function(){
return firstName;
},
"getLastName":function(){
return lastName;
},
"setFirstName":function(name){
return firstName=name;
},
"setLastName":function(name){
return lastName=name;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
person.setFirstName("Kumar");
console.log(person.getFirstName());
We successfully modified firstName but in a controlled manner.
http://jkoder.com/the-module-pattern-javascript-way-of-hiding-data-in-objects-from-public-access/