2016-08-31 3 views
0

プロトタイプのデザインパターンを使い慣れていないので、複数のコンストラクタ変数に対してsetter/getterを作成する最も効率的な方法について簡単に質問しました。オブジェクトコンストラクタからJSのsetter/getterに "this"ポインタを渡す

は、私は「旅」オブジェクトを持っていたと言う:

function trip(){ 
    this.numberOfDays = 0 
    this.price = 0 
    this.activites = [] 
    this.bPacks = [] 
    this.pPacks = [] 
} 

は今の活動、bPacks、およびpPacksすべてのためのセッターは、主に同じことを行います。彼らはそれらが関連付けられている配列に追加または削除します。

代わりのようなこれらの特性のために6つの別々のセッターを書くのように:

trip.prototype.addActivity = function(itemToAdd){ 
    var index = this.activites.push(itemToAdd) 
} 

trip.prototype.addBPack = function(itemToAdd){ 
     var index = this.bPack.push(itemToAdd) 
    } 

等...

はこのような何かをすることが可能です:

trip.prototype.addPacksOrActivity = function(item,typeOfItem){ 
    this.typeOfItem.push(item); 
} 

たち私たちが押したいトリップオブジェクトの特定のプロパティをターゲットにしますか?

セッター/ゲッターをより効率的に構築する方法については、歓迎しますが、私はES6から蒸散するのを避けようとしていますので、ES5タイプの回答が優先されます。

+4

まず、[KISS](https://en.wikipedia.org/wiki/KISS_principle)。あなたは本当に個々のゲッターとセッターが必要ですか? 'myTrip.activities.push(...)'はしません?そうでない場合は、まず外向きのAPIについて心配する必要があります。あなたは本当に 'myTrip.addPacksOrActivity(foo、 'pPacks')' ...をしますか?ひどいですね。 – deceze

+0

@deceze私はあなたのポイントを見ることができます。ここでのユースケースは、(ユーザーが選択肢を変更するために前後に移動したとすると)複数回変更できる非常に長い形式です。現時点ではコードはひどく、もっと構造化されたデザインパターンを探しています。私はハッシュを使用し、Trip.price = fooなどを使用して検索/設定する代わりの方法を見ることができます。 – dpat

答えて

0

はい、あなたがそれを行うには、単純なループを使用することができます。

["activities", "bPacks", "pPacks"].forEach(function(typeOfItem) { 
    var methodName = "add"+typeOfItem[0].toUpperCase()+typeOfItem.slice(1); 
    Trip.prototype[methodName] = function(item) { 
     this[typeOfItem].push(item); 
    }; 
}); 

お知らせbracket notationclosure over typeOfItemの使用。

関連する問題