【问题标题】:JS: OOP private functions / private fields [duplicate]JS:OOP 私有函数/私有字段
【发布时间】:2013-03-08 17:40:44
【问题描述】:
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.... 我如何将它们设置为私有?方法也一样。

感谢您的帮助。

【问题讨论】:

  • 您正在使用对象文字,这并不是在 js 中执行 OOP 的真正方法。尝试使用函数/闭包,这样您就可以模仿公共、私有、继承等......
  • JS 对象中没有“私有字段”,所有属性都是公开的。如果你真的需要隐私,你必须使用闭包(通常是构造函数之一)。看看this question

标签: javascript oop class


【解决方案1】:

这是一种方法。

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

var person = new Person('roman');

【讨论】:

    【解决方案2】:

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

    function Person() {
        var privteProperty = 1;
        var privateMethod = function(){}
    
        this.publicProperty = 2;
        this.publicMethod = function(){}
    }
    

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

    var john = new Person();
    

    【讨论】:

      【解决方案3】:

      我喜欢使用一种工厂模式而不是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 函数。

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2010-09-29
        • 2014-06-19
        • 2013-12-27
        • 2011-12-02
        • 2012-06-07
        • 2012-06-28
        相关资源
        最近更新 更多