残りの質問に答えるには、「コンストラクターなしでこれを行うための回り道は何ですか?」
ブライアンの考えは正しかったのですが、彼が実際に作成していたのは、工場ではなく、個人の所有物を持つ単一のオブジェクトでした。
そのため、「クラス」の各インスタンスに固有のプライベート プロパティのコピーを付与する関数が必要な場合は、これを行うことができます (「Foo」よりも便利なものの実際のクラスを説明します)。概念をよりよく説明するために、「バー」-これを意図した用途に再構成するのは非常に簡単なはずです):
var makeWallet = function (starting_amount) {
var amount = starting_amount,
overdraft = 1000,
addAmount = function (added_funds) { amount += added_funds; },
deductAmount = function (extracted_amound) {
if (is_sufficient_funds(amount, overdraft, extracted_amount)) {
amount -= extracted_amount;
return makeWallet(extracted_amount);
}
},
// other needed public/helper methods here...
// checkBalance(), is_sufficient_funds(), etc...
public_interface = {
// add all public-API methods you need here
addFunds : addAmount,
deductFunds : deductAmount
};
return public_interface;
};
これで、オブジェクトを返す関数ができました。各オブジェクトには、そのオブジェクト固有の「プライベート」(クローズドオーバー)amount
変数にアクセスするメソッドがあります。この変数は、それらのメソッドに固有であり、それらのメソッドのみがアクセスできます。
関数をプライベート スコープで vars としてビルドするか、プライベート スコープで関数宣言としてビルドするか、直接 a に配置するかreturn { func1 : () {...},... };
は、関数が呼び出されたときにその関数の内部で定義されている限り (つまり: ではない)、無関係です。プロトタイプ チェーン (このパターンでは使用できません) では、この関数をnewで呼び出しません)。
さて、それですべて順調です。これで、機能するウォレット メーカーができました (セキュリティ機能とユーザー機能がなくても、ヤダヤダ... ...宿題です)。
しかし、そこにPRIVATE STATICメンバーを追加したい場合はどうでしょうか? 人々に銀行カードを発行できるように、シリアルキーを追跡する必要があるとしたら? または、支店番号を追跡する必要がありましたか? ここで、ブライアンの IIFE の出番です。ただし、完成したウォレット オブジェクトを返す代わりに、ウォレット FACTORYを返します。
var makeWallet = (function () {
var serial_num = 0,
branch_num = "A011002z";
function walletMaker = function (starting_amount) {
/*same function as before, except that you ALSO call:
serial_num += 1; in the construction of the wallet, and assign the id */
var id = serial_num += 1;
return wallet;
}
// then you return the wallet-factory
// which becomes the new value of the outer function
return walletMaker;
}());
これで、静的プロパティ (最も外側のクロージャーで、ウォレット ファクトリが「静的」メンバーとして永続的にアクセスできるようになります) を取得し、インスタンスベースのプライベート メンバーを取得しました。これは内部メソッドの作成中に追加されました。インスタンスオブジェクトに完全にアクセスできます。
これに対する唯一の欠点は次のとおりです。
コンストラクターを使用していないため、この特定のクラスのプロトタイプ機能を失います。うーん。あなたのオブジェクトがこの設定を必要とするなら、それを持たない方が良いでしょう...
...もしそうでなく、public-everything がクールなら、コンストラクタとプロトタイプを使用するか、インライン オブジェクトを構築します。メソッド、および同様に構築された各オブジェクトで動作するサービス (関数) を構築します。
すべてのオブジェクトをこの方法で構築すると、(プライベート参照を囲むために) それぞれ独自の関数のコピーを持つこれらのオブジェクトを何千、または何万も作成すると、メモリのペナルティが発生します。繰り返しますが、これは機能に対して支払う価格です。セキュリティ/クリーンなインターフェイスが必要な場所ではメモリ ヒットを取り、必要のない場所ではメモリ ヒットを取りません。
言うまでもありませんが、金融機関ではこれを使用しないでください。クライアント向けのコードは、実際のお金を追加および削除する機能を信頼するのに最適な場所ではありません...
問題が解決することを願っています。