2
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: '',
    ...
}

在人员部分的开头,这些字段是公共的,可以使用 Systemane.Person.Field.... 我如何将它们设置为私有?对于方法也是如此。

谢谢你的帮助。

4

3 回答 3

2

这是一种方法。

function Person(n) {
   var name = n;
   this.getName = function() {
     return name;
   }
   this.setName = function(newName) {
      name = newName;
   }
}

var person = new Person('roman');
于 2013-03-19T20:33:53.053 回答
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功能。

于 2013-03-19T20:40:51.190 回答
0

使用文字创建对象时,不能有私有属性或方法。实际上,JavaScript 中没有私有属性,但您可以通过使用构造函数并将私有属性和方法声明为变量来实现这一点:

function Person() {
    var privteProperty = 1;
    var privateMethod = function(){}

    this.publicProperty = 2;
    this.publicMethod = function(){}
}

然后你可以创建一个实例:

var john = new Person();
于 2013-03-19T20:35:39.687 回答