2016-11-19 17 views
0

私のコードの以下の部分を使用して、私はオブジェクトの名前( "オブジェクトの名前"はfoo、bar、baz、およびjarを参照しています。それは不適切な言葉であり、それらと呼ばれるウェブ上のこのような例は、構築された関数の値を使用して見つけることができませんでした)。例与えるために:私はそれぞれxとy、50と100の両方の価値を持っているのであればコンストラクタの引数の値を使用してオブジェクトの名前を見つける

function myFunction(){ 
    foo = new component(50, 50, "first", "red"); 
    bar = new component(50, 100, "sec", "red"); 
    baz = new component(0, 50, "third", "blue"); 
    jar = new component(0, 100, "fourth", "blue"); 
} 
function component(x, y, id, color){ 
this.x = x; 
this.y = y; 
this.id = id; 
this.color = color; 
} 

を、どのような方法私はプログラムは、これらの値を持つコンストラクタがあることを認識するように、それを作るために使用しますバー? 2つの値を使用してこれを行うことが不可能な場合は、1つの値だけを使用すると、2つを1つにまとめることができるので、まったく問題ありません。これまでのところ私ができることは、 "foo instanceof component"が真であるということでした。なぜなら、基本的にインスタンスの反対であることがわかっている方法がありますか?前もって感謝します。

+0

'foo'、' bar'、 'baz'、' jar'はコンストラクタではなく、オブジェクトです。 'component'はここで唯一のコンストラクタです。私は理解していると思う。だから、 'x'と' y'を入力として、それが関連付けられているオブジェクトを返したいのですか? – 4castle

+0

はい、まさにそれです。正しい言葉もありがとう。 – Gnago

答えて

3

foobarbazおよびjarはコンストラクタではなく変数です。これらの変数は、component関数をコンストラクタとして使用して作成されたオブジェクトを指しています。

これは、xとyの特定の値を使用して作成されたオブジェクトを見つけることです。それを行う1つの方法は、キーがxとyの組み合わせであるルックアップテーブルを持っているだろう、との値がオブジェクトである。このアプローチの

var objects = {}; 
function component(x, y, id, color) { 
    this.x = x; 
    this.y = y; 
    this.id = id; 
    this.color = color; 

    // Insert the current object into the lookup table 
    objects[x + '_' + y] = this; 
} 

// Retreive an object from the lookup table 
function findObject(x, y) { 
    return objects[x + '_' + y]; 
} 

一つの問題は、あなたが2つのオブジェクトを作成した場合ということです同じxとyの値は、最後のものだけルックアップテーブルに格納されます。代わりに、各キーのオブジェクトの配列を格納することで解決できます。

+2

しかし、私は何を意味するかを見るために、[fiddle](https://jsfiddle.net/o0aydkn3/)をチェックすることをお勧めします。つまり、あなたが "誤って" 'を使用し、' component.get'を使うと 'component 'が得られることが明らかになります –

+1

2つのオブジェクトのxとyの値が同じになるまで動作します。 :-(また、xとyが変わると、オブジェクトのキーも変わる必要があります。 – RobG

+0

@RobG、これは問題になりました。私は 'console.log(foo)'を実行するとxとyを変更すると 'component {x:new value、y:new value、...}'と表示されますが、元の値を使用する場合にのみコンポーネントを再度選択できます。 – Gnago

0

ニコのコードとJaromanda Xの自己完結型コードを使用して、ユーザーがキーを見つけられるようにオブジェクトを更新することができました(または変数が変わっても、私はまだ不明です)新しいx値とy値に基づいて

function myFunction(){ 
    foo = new component(50, 50, "first", "red"); 
    bar = new component(50, 100, "sec", "red"); 
    baz = new component(0, 50, "third", "blue"); 
    jar = new component(0, 100, "fourth", "blue"); 
} 
var component=(function(){ 
    var component=function(x, y, id, color){ 
    this.x = x; 
    this.y = y; 
    this.id = id; 
    this.color = color; 
    objects[x+'_'+y] = this; 
    this.newPos = function(x, y){ 
     this.x = x; 
     this.y = y; 
     //objects[this.x+"_"+this.y] = this; 
    }; 
    }; 
    component.get = function(x, y){ 
    return objects[x+'_'+y]; 
    }; 
    return component 
})(); 

「this.newPos」を使用すると、そのパラメータが何であるかによって、このxとyを変更しますが、これだけではRobGとして、キー/変数のオリジナルのxとyの値を引き続き使用するユーザーを強制します指摘した。これを修正するには、newPosのコメントを削除してください。このコードは、 'objects.x'と 'y'の値を 'this.x'と 'this.y'がnewPosにあるものにします。これは新しい値になります。

+1

明快にするために、 'foo = ...'と書くと、JSは 'foo'という名前が最初に出てきたことを認識しているので、舞台裏で' var foo; 'を例えば、 'x'は' foo.x'や 'foo ['x']'を使って参照できるfooのキーです。 。 – Nico

関連する問題