JS:OOP私有函数/私有字段

时间:2013-03-19 20:30:19

标签: javascript oop class

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调用....如何将它们设置为私有?和方法一样。

谢谢你的帮助。

3 个答案:

答案 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的值保留在该函数内。基本上它甚至在函数执行完毕后仍然存在。您可以通过getNamesetName函数访问或修改该变量的唯一方法。