ここでいくつかのことが起こっています。まず、オブジェクトのメソッドの定義について心配する前に、オブジェクトの作成について心配してください。
したがって、オブジェクトを作成する方法はいくつかあります。まず、インライン オブジェクトを作成できます。
var obj = { property : "myProperty", func : function () {} };
これで、真新しいオブジェクトができました。後から追加することで、そのオブジェクトを拡張できます。
obj.property02 = "myOtherProperty";
obj.otherFunc = function () { return this.property02; };
しかし、インライン オブジェクトを構築することの欠点は、すべてのプロパティとメソッドが 100% パブリックであることです。
これに対処するために、オブジェクトを作成して返すコンストラクタ関数を使用できます。
var MakeWallet = function (starting_amount, pin) {
var balance = 0,
wallet = {};
wallet.add = add_balance;
wallet.deduct = deduct_amount;
wallet.amount = check_balance;
return wallet;
function check_balance (pin) { /*...*/ }
function validate_pin (user_pin) { /*...*/ }
function add_balance (amount, pin) { /*...*/ }
function deduct_amount (amount, pin) { /*...*/ }
};
var myWallet = MakeWallet(1, 9274);
私は私のトラブルのために何を得ますか? すべてのデータは改ざん防止されています。
ユーザーはwallet.deduct
.ウォレットを追跡するために付与したい内部セキュリティ番号またはエンティティ/シリアル番号。
それがこのように構築する利点です。
繰り返しますが、後でメソッドとプロパティをウォレットに追加できます。
myWallet.breakItOpen = function () { return this.balance; };
myWallet.stuffIt = function () { balance = 400000000; };
しかし、これらのどちらも、元の myWallet 内の変数や関数に実際にアクセスすることはできません。
作成時に存在した関数のみがアクセスできます。
他の、より伝統的な作成方法では、クラスのようなコンストラクター関数を使用できますthis
。
function MakeWalletClass (starting_amount, pin) {
var balance = 0,
serial_and_pin = generate_serial() + "_" + pin;
this.balance = balance;
this.checkBalance = function () { return this.balance; };
}
var myWalletInstance = new MakeWalletClass(1, 1234);
しかし、問題があります:
myWalletInstance.balance
公開されています。
誰でも見ることも変更することもできます。
良くない。
これを行うことでそれを回避できます:
function MakeWalletClass (starting_amount, pin) {
var balance = 0,
serial_and_pin = generate_serial() + "_" + pin;
this.checkBalance = function () { return balance; };
}
var myWalletInstance = new MakeWalletClass(1, 1234);
現在、公開されている編集可能なプロパティではなく、this.checkBalance
非表示の変数を読み取っています。balance
さて、MakeWalletClass.prototype
.
コンストラクター パターン (つまり、 にプロパティを追加してthis
を返す関数this
、または何も返さない関数 (this
バックグラウンドで返される関数) を使用する場合、プロパティとメソッドを追加するとnew
、prototype
プロパティとメソッドが追加されます。作成したオブジェクトのすべてのインスタンスで利用できます。
したがって、銀行が「The Bank of Bob」と呼ばれる場合、次のように追加できます。
MakeWalletClass.prototype.bankName = "The Bank of Bob";
のすべてのインスタンスにプロパティnew MakeWalletClass();
がbankName
あり、すべてがまったく同じ値になり、すべてが公開されます。
var yourWalletInstance = new MakeWalletClass(500, 2341);
yourWalletInstance.bankName; // "The Bank of Bob";
プロパティは、コンストラクタ関数のプロトタイプにプロパティを追加する前にprototype
作成したオブジェクトでも使用できます。
prototype
同じ方法でメソッドを追加できます。
var myWalletInstance = new MakeWalletClass(1, 1234);
MakeWalletClass.prototype.getBalance = function () { return balance; };
myWalletInstance.getBalance(); // undefined;
おっと!
うまくいきません。
プロトタイプ関数は、パブリック プロパティ (で呼び出すことができるもの) にのみthis.XXX
アクセスできます。
したがって、prototype
プロパティを追加する利点は、多くのメモリを節約できることです。プログラムが 3000 個のウォレットを必要とprototype function
し、コンストラクターに を追加した場合、その関数はメモリ内に 1 回しか存在しません。
プロトタイプを追加することの欠点は、それが公共のことしかできないことです。そのため、バランスを取ったり、公共のプロパティを固定したりしない限り (ヒント: しないでください)、プロトタイプはプライベートな作業には役に立ちません。
したがって、これらの 3000 のウォレットには、残高またはピンを処理するメソッドの 3000 のコピーが必要です。
これですべてを理解できたので、何prototype
のために...次の本当の違いがあります。
MakeWalletClass.prototype.say_bankName = function () { /*...*/ };
と
MakeWalletClass.say_bankName = function () { /*...*/ };
はprototype
インスタンス ( wallet = new MakeWalletClass
) で機能し、 のメソッドはそうでMakeWalletClass
はありません。これは、 に関数をアタッチしたい場合にのみ役立ちますMakeWalletClass
。
作成されたウォレットの数を返す関数が必要かもしれません...