JS で参照されるものはすべてthis
公開されます。
ただし、クロージャーの概念のおかげで、関数内で変数 (または関数) を宣言するだけで、完全にプライベートな状態にすることができます。
さらに、コーディングでプロトタイプを作成しようとしている場合を除き、 も必要ありませnew
んthis
。
例:
var makePerson = function (secret) {
var is_alive = true,
sayName = function () {
if (!is_alive) { return; }
console.log("My name is " + secret.name + ".");
},
sayAge = function () {
if (!is_alive) { return; }
console.log("My age is " + secret.age + ".");
},
haveBirthday = function () {
if (!is_alive) { return; }
secret.name += 1;
console.log("I'm " + secret.name +
", and today I turned " + secret.age + ".");
},
die = function () {
is_alive = false;
console.log(secret.name + " died today;" +
" they were " + secret.age + " year" +
(secret.age > 1 ? "s" : "") + " old." );
},
public_interface = { sayName : sayName,
sayAge : sayAge,
haveBirthday : haveBirthday,
die : die };
return public_interface;
};
var bob = makePerson({ name : "Bob", age : 32 });
誰も触れたりsecret.name
、外から触れたりすることはできません。secret.age
is_alive
bob.name; // undefined
bob.is_alive = false; // Doesn't matter -- the code isn't relying on a public property.
bob.sayAge(); // "My age is 32"
bob.haveBirthday(); // "I'm Bob, and today I turned 33"
bob.die(); // "Bob died today; they were 33 years old"
さらに良いことに、JS ではいつでも割り当てを変更できるため、次のような心配があるかもしれません。
// person overwriting the function
bob.haveBirthday = function () { is_alive = false; };
...しかし、誰かがそれを行うことを恐れる理由はまったくありません。彼らはそれらの内部プロパティにアクセスできないからです。
bob.haveBirthday(); // window.is_alive = false;
bob.sayAge(); "My age is 33";
同様に、値を盗むように関数を書き直そうとすると、次のようになります。
bob.sayName = function () { return secret.name; };
bob.sayName(); // window.secret.name; OR ERROR: can't call `name` of `undefined`
関数のINSIDEで定義されていない関数は、内部プロパティまたはメソッドにアクセスできません。
また、まったく同じ方法でプライベート メソッドを使用することもできます。実際、これらの関数はすべて、public_interface
オブジェクトにすべてアタッチするまではプライベートでした (これが返されました)。
を使い始める場合は、これを覚えておくことが重要ですprototype
。
var Thing = function (secret) {};
Thing.prototype.sayName = function () { console.log("My name is " + secret.name); };
var thing = new Thing({ name : "Bob", age : 32 });
thing.sayName(); // "My name is undefined"
プロトタイプ関数でさえ、プライベート状態にアクセスできません。パブリック状態を使用する必要があります (を介してthis
)。
public
複数のクロージャに、private
、private static
およびpublic static
(これが最も似ている) プロパティを持たせる、より複雑な構造を使用できますが、これはprototype
少し高度で、最初は少し混乱します。