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');
}
}
}
我正在学习oop如何在js中工作,现在我对私有方法和领域有点困惑。我想在个人栏目中有一些私人会员,例如'personCount'或'lastAddedPerson'。如果我像这样添加它们:
Person:
{
personCount: 0,
lastAddedPerson: '',
...
}
在person部分的开头,字段是公共的,可以使用Systemane.Person.Field调用....如何将它们设置为私有?和方法一样。
谢谢你的帮助。答案 0 :(得分:2)
这是一种方式。
function Person(n) {
var name = n;
this.getName = function() {
return name;
}
this.setName = function(newName) {
name = newName;
}
}
var person = new Person('roman');
答案 1 :(得分:0)
使用文字创建对象时,不能拥有私有属性或方法。事实上,JavaScript中没有私有属性,但您可以通过使用构造函数,并将私有属性和方法声明为变量来实现:
function Person() {
var privteProperty = 1;
var privateMethod = function(){}
this.publicProperty = 2;
this.publicMethod = function(){}
}
然后您可以使用以下命令创建实例:
var john = new Person();
答案 2 :(得分:0)
我喜欢使用某种工厂模式而不是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
函数访问或修改该变量的唯一方法。