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:面向对象私有函数/ private字段

我正在学习如何在空中接力JS的作品,现在我有点困惑私有方法和字段。我想在个人版块中添加一些私人成员,例如“personCount”或“lastAddedPerson”。如果我加入他们是这样的:在人部分的开头

Person: 
{ 
    personCount: 0, 
    lastAddedPerson: '', 
    ... 
} 

,字段是公开的,可以用Systemane.Person.Field叫....我怎么可以设置为私有?和一个方法一样。

thx为您的帮助。

+0

您正在使用对象字面值,这不是真正在js中执行OOP的方法。尝试使用函数/闭包,这样你可以模仿公共,私人,继承等... – 2013-03-19 20:35:59

+0

在JS对象中没有“私人领域”,所有的属性都是公共的。如果你真的需要隐私,你必须使用闭包(通常是构造函数之一)。看看[这个问题](http://stackoverflow.com/q/13418669/1048572) – Bergi 2013-03-19 20:36:12

这是一种方法。

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的值保留在该函数中。基本上,即使在函数完成执行后,它仍然会挂起。您可以访问或修改该变量的唯一方法是通过getNamesetName函数。