2016-11-19 3 views
0

Mit dem folgenden Teil meines Codes habe ich versucht, den Namen des Objekts zu finden ("Objektname" bezieht sich auf foo, bar, baz und jar unten) das ist der unpassende Ausdruck, konnte keine Beispiele wie dieses im Netz finden, das sie nannte) die Werte der konstruierten Funktion verwendend. Um ein Beispiel zu geben:Den Namen des Objekts mit den Werten des Konstruktorarguments finden

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; 
} 

Also, wenn ich den Wert von x und y habe, 50 bzw. 100, welche Methode würde ich es so machen, dass das Programm erkennt, dass der Konstruktor mit diesen Werten ist Bar? Wenn dies mit zwei Werten nicht möglich ist, ist die Verwendung von nur einem Wert völlig in Ordnung, da ich die beiden immer nur zu einem kombinieren kann. Bisher war das Beste, was ich mir ausgedacht habe, dass etwas funktioniert hat, dass "foo instanceof component" wahr ist, also gibt es vielleicht eine Methode, die ich noch finden muss, die im Grunde das Gegenteil von instance of ist? Vielen Dank im Voraus.

+0

'foo',' bar', 'baz' und' jar' sind keine Konstruktoren, sie sind Objekte. 'Komponente' ist hier der einzige Konstruktor. Ich denke, ich verstehe es aber. Sie möchten also "x" und "y" als Eingabe erhalten und das Objekt zurückgeben, mit dem es verknüpft ist? – 4castle

+0

Ja, genau das. Danke auch für die richtigen Begriffe. – Gnago

Antwort

3

In Ihrem Code foo, bar, baz und jar sind Variablen, nicht Konstrukteuren. Diese Variablen verweisen auf Objekte, die mit der Funktion als Konstruktor erstellt wurden.

Es klingt wie das, was Sie versuchen, das Objekt zu finden, das mit den spezifischen Werten für x und y erstellt wurde. Eine Möglichkeit, dies zu tun wäre, um eine Nachschlagtabelle zu haben, wo die Schlüssel sind die Kombination von x und y, und die Werte sind die Objekte:

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]; 
} 

Ein Problem bei diesem Ansatz ist, dass, wenn Sie zwei Objekte mit die gleichen x- und y-Werte, nur der letzte wird in der Nachschlagetabelle gespeichert. Sie könnten das lösen, indem Sie stattdessen ein Array von Objekten für jeden Schlüssel speichern.

+2

Gute Antwort, ich würde jedoch empfehlen, diese Selbstbeherrschung zu machen - prüfe [fiddle] (https://jsfiddle.net/o0aydkn3/), um zu sehen, was ich meine ... dh, es gibt keine Möglichkeit, dass du "versehentlich" Objekte "überlisten" kannst ', und die Verwendung von' component.get' macht es offensichtlich, dass Sie eine 'Komponente' erhalten. –

+1

Funktioniert, bis 2 Objekte die gleichen x- und y-Werte haben. :-(Auch wenn sich x und y ändern, muss sich auch der Schlüssel zum Objekt ändern. – RobG

+0

@RobG, ja das wurde ein Problem. Ich konnte es so machen, dass wenn ich 'console.log (foo)' danach mache Wenn man x und y ändert, würde man sagen: "Komponente {x: neuer Wert, y: neuer Wert, ...}", aber ich kann die Komponente nur dann wieder auswählen, wenn ich ihre ursprünglichen Werte verwende Ich finde eine Arbeit rum? – Gnago

0

Mithilfe von Nicos Code zusammen mit dem selbstenthaltenden Code von Jaromanda X konnte ich Objekte aktualisieren, damit der Benutzer den Schlüssel finden kann (oder ist er variabel, ich bin immer noch etwas unsicher, egal was "foo" ist) basierend auf den neuen x- und y-Werten. Mit

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‘ wird sich ändern, um dieses x und y, je nachdem, was seine Parameter sind, aber das allein wird den Benutzer zwingen, weiterhin die Schlüssel/Variable ursprünglichen x- und y-Werte zu verwenden, wie RobG wies darauf hin. Um dies zu beheben, entfernen Sie einfach den Kommentar in newPos. Der Code wird 'Objekte' x- und y-Werte zu dem machen, was 'this.x' und 'this.y' in newPos sind, was die neuen Werte sein werden.

+1

Um zu verdeutlichen, wenn Sie 'foo = ...' schreiben, erkennt JS, dass dies das erste Mal ist, dass der Name 'foo' erwähnt wurde, also hinter den Kulissen' var foo; 'vor dem Mit anderen Worten, foo ist eine Variable, Schlüssel beziehen sich auf die Mitglieder von Objekten, so ist zum Beispiel 'x' ein Schlüssel in foo, auf den Sie mit' foo.x' oder 'foo ['x']' verweisen können . – Nico

Verwandte Themen