2013-03-19 21 views
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'); 
    } 
} 

}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

回答

2

這是一種方法。

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

var person = new Person('roman'); 
0

當您使用文字創建對象時,您不能擁有私有屬性或方法。事實上,也有在JavaScript中沒有專用屬性,但你可以通過使用一個構造函數,並宣佈私有屬性和方法作爲變量實現,在實踐中:

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

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

然後,您可以用創建一個實例:

var john = new Person(); 
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函數。