JS:面向对象私有函数/ private字段
问题描述:
Systemname =
{
Question :
{
send: function()
{
console.log("send");
},
read: function()
{
console.log("read");
},
delete: function()
{
console.log("delete");
}
},
Answer :
{
send: function()
{
console.log("Answer sent");
}
},
Person :
{
foo: 'foo',
bar: 'bar',
add: function(name)
{
console.log('person "' + name + '" added');
},
remove: function(id)
{
console.log('person with id "' + id + '" removed');
}
}
我正在学习如何在空中接力JS的作品,现在我有点困惑私有方法和字段。我想在个人版块中添加一些私人成员,例如“personCount”或“lastAddedPerson”。如果我加入他们是这样的:在人部分的开头
Person:
{
personCount: 0,
lastAddedPerson: '',
...
}
,字段是公开的,可以用Systemane.Person.Field叫....我怎么可以设置为私有?和一个方法一样。
thx为您的帮助。
答
这是一种方法。
function Person(n) {
var name = n;
this.getName = function() {
return name;
}
this.setName = function(newName) {
name = newName;
}
}
var person = new Person('roman');
答
当您使用文字创建对象时,您不能拥有私有属性或方法。事实上,也有在JavaScript中没有专用属性,但你可以通过使用一个构造函数,并宣布私有属性和方法作为变量实现,在实践中:
function Person() {
var privteProperty = 1;
var privateMethod = function(){}
this.publicProperty = 2;
this.publicMethod = function(){}
}
然后,您可以用创建一个实例:
var john = new Person();
答
我喜欢使用,而不是new
一种工厂模式:
var Person = (function() {
return {
create: function(name) {
return (function(n) {
var name = n;
function getName() {
return name;
}
function setName(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
}(name));
}
};
})();
然后:
var person = Person.create("Bob");
person.getName(); //returns Bob
person.setName("Jimbo");
person.getName(); //returns Jimo
看起来很复杂,但很简单。
Person
实质上被分配了匿名自调用函数的返回值。这个返回值有一个名为create
的属性,它是对另一个函数的引用,它或多或少就像构造函数一样。该函数还返回另一个匿名自调用函数的返回值。但是,此返回值是所需对象的实际实例。在这个匿名自调用函数中,您可以看到我有一个名为name
的变量。这个变量对于那个匿名的自我调用函数是私有的,并且在词法上被绑定到它所定义的范围。这意味着name
的值保留在该函数中。基本上,即使在函数完成执行后,它仍然会挂起。您可以访问或修改该变量的唯一方法是通过getName
和setName
函数。
您正在使用对象字面值,这不是真正在js中执行OOP的方法。尝试使用函数/闭包,这样你可以模仿公共,私人,继承等... – 2013-03-19 20:35:59
在JS对象中没有“私人领域”,所有的属性都是公共的。如果你真的需要隐私,你必须使用闭包(通常是构造函数之一)。看看[这个问题](http://stackoverflow.com/q/13418669/1048572) – Bergi 2013-03-19 20:36:12