0

重複の可能性:
JavaScript プロトタイプ関数で「this」への参照を保持する

私は英語がうまくない。ご理解ください

私の友達がjavascript oopを実装しているとき

function Item (a, b, c) {
    var _a = a, _b = b, _c = c;

    return {
        init: function () {
            ...
        },
        start: function () {
            ....
        }
    }
}
var item = new Item();
item.init();
item.start();

しかし、私は次のことを知りたいです。

function Item (a, b, c) {
    this.a = a, this.b = b, this.c = c;
}

Item.prototype.init = function () {...}
Item.prototype.start = function () {...}
var item = new Item();
item.init();
item.start();

あなたはどちらだと思いますか?

4

2 に答える 2

1

パラメーター

あなたの友人:

パラメータが「_」バージョンに再割り当てされるのはなぜですか? パラメータは、ローカル変数と同じことを認識しているすべての意図と目的のためのものです。

あなたのもの:

なぜこれらのパラメーターを公開する必要があると思いますか? これらの値がオブジェクト インスタンスにのみ関係する場合は、ローカル変数のままにする必要があります。オブジェクトが存在する限り存在し、プロパティである必要はありません。

プロトタイプ

ここでプロトタイプを使用する理由 多くの正当な理由がありますがthis.method、コンストラクター内で定義されたローカル変数にアクセスできるため、最初に使用します。プロトタイプ メソッドはできません。

new function(){} と {} の比較

私はほとんどの場合、{} オブジェクトをデータのみ、または適切な OOP 構造よりもユーティリティ メソッドのコレクションである単純な構造体型のオブジェクト用に予約しています。しかし、状態を維持する必要があるものをモデル化したら、通常は関数コンストラクターを使用します。

var sleepyInstance = new function(){
    var activeState = true;

    this.sleep = function(){
        activeState = false;
    }

    this.doSomething = function(){
        if(activeState){ alert ('did something!'); }
        else { alert('ZZZZZzzz'); }
    }

}

プロトタイプは、オブジェクト ファクトリ、デフォルトのプロトタイプ メソッドをオーバーライドするための「this」の使用、および継承などに使用することをお勧めします。プロパティを公開する必要があるかどうかわからない場合は、それを var にします。プロトタイプを使用している理由がわからない場合は、「this」を使用してメソッドをインスタンスに直接アタッチしてください。通常、プロトタイプは、同様のオブジェクトをさまざまな方法で構築するのに最も適しています。

于 2012-12-13T06:46:16.687 に答える
1

それらにはいくつかの違いがあります。最初のケースでは:

function Item (a, b, c) {
    var _a = a, _b = b, _c = c;

a2 行目のb,cは既にクロージャに保持されているローカル変数であるため、プライベート変数をエミュレートする必要はありません。次のように記述できます。

function Item (_a, _b, _c) {

他の人が指摘したように、 なしで呼び出す必要がありますnew

2番目に:

function Item (a, b, c) {
    this.a = a, this.b = b, this.c = c;

新しいオブジェクトには public abcプロパティがあります。プライベート メンバーが必要か (まれ)、継承が必要か (必要でないのはかなり一般的です) は、要件によって異なります。多くの場合、シングルトンで十分なので、プレーンなオブジェクトで十分であり、最初のパターンを使用できます。

これは、 Richard Cornfordらによって開発され、Douglas Crockford によって一般化されたモジュール パターンへの短いステップにすぎません。

于 2012-12-13T06:14:35.033 に答える