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でoopがどのように機能するかを学んでおり、プライベートメソッドとフィールドについて少し混乱しています。「personCount」や「lastAddedPerson」などのプライベートメンバーをpersonセクションに入れたいのですが。私がこのようにそれらを追加した場合:

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

個人セクションの冒頭で、フィールドは公開されており、Systemane.Person.Field ....で呼び出すことができます。どうすればそれらを非公開に設定できますか?メソッドについても同じです。

あなたの助けのためのthx。

4

3 に答える 3

2

これが1つの方法です。

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

リテラルを使用してオブジェクトを作成する場合、プライベートプロパティまたはメソッドを持つことはできません。実際、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 に答える
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 に答える