2017-05-19 3 views
0

私は以下のようにJavaスクリプトのOOPパターンを持っています:メインオブジェクト(Team)はプロパティとして他のオブジェクト(Players)を持っています。機能を持つmixinは、メソッドを保持するためにTeamオブジェクトとPlayerオブジェクトの両方に存在します。両方のオブジェクトの新しいインスタンスはコンストラクタ関数を使用して作成され、プレーヤオブジェクトはパラメータとしてTeamオブジェクトに渡されます。ミックスインは、その後のアプローチは、ここでより十分に説明(方法が利用可能であることをできるようにするオブジェクトを呼び出します。変数に格納されたデータ配列を関数mixinパターンOOPに渡します。

https://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/

を今、新しいプレーヤーのプロパティは、数字の配列である私は、「ハードコード」した場合。私は新しいPlayerを作成するときに何かを実行し、オブジェクト上でメソッドを使用することができますが、データ選択をより動的にしたいと考えています(たとえば、配列内の値はメニュー選択などによって変更されることがあります)。この理由は、データ配列を変数に保存したままにして、その変数を新しいPlayerコンストラクタシーケンスに渡しても、mixin機能を維持したいということです。残念ながら、単に変数名をそのまま、または[]表記、機能を破り、結果なしでの結果またはNaNはにconsole.log要求についての結果..

誰が説明コメントでこのステップを作る...

コードは次のように助けることができます:

// Mixin for Team methods... 

var asTeam = function() { 
    this.ability1 = function() { 
    var ab = (this.p1.p4arr[4] + this.p2.p5arr[2]); 
    return ab; 
    }; 
    return this; 
}; 

// Mixin for Player Methods..The methods use calculations of different values within the property arrays.. 
var asPlayer = function() { 
    this.skill1 = function() { 
    var a = this.p4arr[0] + this.p5arr[0]; 
    return a; 
    }; 
    this.skill2 = function() { 
    var a = this.p5arr[2] * this.p6arr[3]/this.p4arr[4]; 
    return a; 
    }; 
    return this; 
}; 

// constructor function for Teams.. 
var Team = function(p1, p2, p3) { 
    this.p1 = p1; 
    this.p2 = p2; 
    this.p3 = p3; 
}; 

// constructor function for Players.. 
var Player = function(p4arr, p5arr, p6arr) { 
    this.p4arr = p4arr; 
    this.p5arr = p5arr; 
    this.p6arr = p6arr; 
}; 

// call the object prototypes from Mixins.. 
asTeam.call(Team.prototype); 
asPlayer.call(Player.prototype); 

// create a new Players.. 

// If used, this code works... 

//var john = new Player([3,7,9,4,1,6],[2,16,3,5,1,1],[24,6,3,21,5,3]); 
//var bob = new Player([2,2,1,3,4,1],[3,8,6,2,1,4],[6,4,8,6,2,5]); 
//var ian = new Player([3,8,3,2,5,4],[2,7,4,3,7,3],[7,4,8,5,3,2]); 

// Instead want to use this code or something similar that works to pick up the data arrays from the variables at the bottom ... 

var john = new Player(arr1, arr2, arr3); 
var bob = new Player(arr4, arr5, arr6); 
var ian = new Player(arr7, arr8, arr9); 

//or (doesnt work either) 

// var john = new Player([arr1],[arr2],[arr3]); 
//etc.. 

// create a new Team 
var Team1 = new Team(john, bob, ian); 

console.log(Team1.ability1()); 
console.log(john.skill2()); 
console.log(bob.skill1()); 
console.log(john.p4arr); 

// data arrays stored in variables.. 

var arr1 = [3, 7, 9, 4, 1, 6]; 
var arr2 = [2, 16, 3, 5, 1, 1]; 
var arr3 = [24, 6, 3, 21, 5, 3]; 

var arr4 = [2, 2, 1, 3, 4, 1]; 
var arr5 = [3, 8, 6, 2, 1, 4]; 
var arr6 = [6, 4, 8, 6, 2, 5]; 

var arr7 = [3, 8, 3, 2, 5, 4]; 
var arr8 = [2, 7, 4, 3, 7, 3]; 
var arr9 = [7, 4, 8, 5, 3, 2]; 
+0

これらのハードコードされた配列インデックスはすべて、配列ではなくオブジェクトを使用する必要があると思います。また、プロパティに 'p1'、' p2'、 'p3'よりもわかりやすい名前を付けてください。 – Barmar

+0

'新しいプレーヤー(arr1、arr2、arr3)'が動作するはずです。変数を割り当てた後*実行するだけです。 – Barmar

+0

私の実際のコードでは変数は全く異なるjsファイルに入っているので、シーケンスは考慮しませんでした。データがオブジェクトとして保存されているか、JSONファイルとして保存されているかを正確に記述してください。その解決策に取り組んでいると私は言います...もう一度ありがとう.. – evertine2017

答えて

0

あなたがしています変数を初期化する前にコンストラクタを呼び出して、未定義の値をコンストラクタに渡します。

// data arrays stored in variables.. 

var arr1 = [3, 7, 9, 4, 1, 6]; 
var arr2 = [2, 16, 3, 5, 1, 1]; 
var arr3 = [24, 6, 3, 21, 5, 3]; 

var arr4 = [2, 2, 1, 3, 4, 1]; 
var arr5 = [3, 8, 6, 2, 1, 4]; 
var arr6 = [6, 4, 8, 6, 2, 5]; 

var arr7 = [3, 8, 3, 2, 5, 4]; 
var arr8 = [2, 7, 4, 3, 7, 3]; 
var arr9 = [7, 4, 8, 5, 3, 2]; 

var john = new Player(arr1, arr2, arr3); 
var bob = new Player(arr4, arr5, arr6); 
var ian = new Player(arr7, arr8, arr9); 

// create a new Team 
var Team1 = new Team(john, bob, ian); 

console.log(Team1.ability1()); 
console.log(john.skill2()); 
console.log(bob.skill1()); 
console.log(john.p4arr); 
関連する問題