隠し変数 (クロージャを使用) を持つオブジェクトと、それらの隠し変数を利用するメソッドを作成したいと考えています。ただし、インスタンス化ごとにこれらのメソッドを再作成したくありません。一度は覚えておきたいですね。オブジェクトをインスタンス化するために単純な関数を使用しています。
ここにいくつかのコードがあります:
function Mario () {
var mario = {}; // create the obj
mario.name = "Mario"; // create a property on it
mario.hp = (function () { // set up a closure
var currentHp = Mario.baseHp * 100; // create a "hidden" variable
return function (value) { // return the hp function that utilizes the hidden currentHp variable
if (!!value) {
return currentHp = ((currentHp * Mario.baseHp) + value);
}
return currentHp * Mario.baseHp;
};
}());
return mario; // send along the newly created object
}
Mario.baseHp = 1;
var mario = Mario();
log(mario);
log(mario.hp());
log(mario.hp(-20));
log(mario.hp());
ここでの問題は、別の「マリオ」オブジェクトを作成するたびに、メモリ内に hp 関数を再度作成してしまうことです。これまでの解決策に対する私の試みは次のとおりです。
function Mario () {
var mario = {}; // create the obj
mario.name = "Mario"; // create a property on it
mario.hp = (function () { // set up a closure
var currentHp = Mario.baseHp * 100; // create a "hidden" variable
return Mario.hp; // reference the hp function below..... but the context is wrong, it needs access to currentHp variable.
}());
return mario; // send along the newly created object.
}
Mario.baseHp = 1;
Mario.hp = function (value) { // Create the hp function once in memory
if (!!value) {
return currentHp = ((currentHp * Mario.baseHp) + value);
}
return currentHp * Mario.baseHp;
};
var mario = Mario();
log(mario);
log(mario.hp());
log(mario.hp(-20));
log(mario.hp());
しかし明らかに、Mario.hp のコンテキストは間違っています。これを解決する call または apply を使用する方法があるかもしれないと考えています。どんな助けでも揺れるでしょう!