2

クライアント側のオブジェクトを作成するためのテクニックはかなりあるようです。私が本当に混乱しているのは、各テクニックが何と呼ばれているかを判断することです。以前にプロトタイプを使用したことがあります

MyObject.prototype.someMethod = function (e, a) {
      .....
};

しかし、このように別の方法で作成されたオブジェクトも見てきました

MyObject.someMethod = function () {
      ....
}

2 番目のテクニックは何と呼ばれ、なぜ 1 つを他のテクニックよりも優先して使用するのでしょうか?

4

4 に答える 4

1

最も簡単な答えは、prototypeキーワードを使用してオブジェクトのメソッドを定義すると、そのメソッドを継承するすべてのオブジェクトでそのメソッドを使用できるようになるということです。

JavaScriptにはクラスはありませんが、プロトタイプオブジェクト(プロパティ)を使用して継承をエミュレートできます。

myObject.prototype.methodは、myObjectから派生したすべてのオブジェクトに「メソッド」を追加します(jQueryがロードされた後にjQueryにこれを行うことができます-$。prototype.method[$.fn.method]はすべてのjQueryオブジェクトにメソッドを追加しますそれらがいつ作成されたかに関係なく)。

myObject.methodは、コード行が実行されたときの「メソッド」(静的メソッド)のみをmyObjectに追加します。この行が実行される前に呼び出されたmyObjectは、「メソッド」にアクセスできません。

于 2012-08-03T17:58:42.937 に答える
1

ここでいくつかのことが起こっています。まず、オブジェクトのメソッドの定義について心配する前に、オブジェクトの作成について心配してください。

したがって、オブジェクトを作成する方法はいくつかあります。まず、インライン オブジェクトを作成できます。

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バックグラウンドで返される関数) を使用する場合、プロパティとメソッドを追加するとnewprototypeプロパティとメソッドが追加されます。作成したオブジェクトのすべてのインスタンスで利用できます。

したがって、銀行が「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

作成されたウォレットの数を返す関数が必要かもしれません...

于 2012-08-03T18:52:05.033 に答える
1

Javascript は、プロトタイプの継承と呼ばれるものを使用して、特性の継承を実装します。次の例を検討してください。

Superclass = function() {
   //constructor code
}

Superclass.prototype.toString=function() {
    return "Derp!";
}
Superclass.derp= function(){return 'herp!'}



var instance = new Superclass();
instance.toString();//valid
instance.derp();//fails
于 2012-08-03T18:18:22.943 に答える