2016-04-22 9 views
1

Ich habe ein Beispiel Objekt wie solche:Was ist der schnellste Weg, eine Funktion in einem Objekt anzuhängen oder zu bearbeiten?

var shooter = {fire : function(){shootRightHandGun("shotgun");}} 

sagen aber der Schütze eine neue Waffe findet, und wir wollen Schützen-Feuer-Funktion auf diese einzustellen:

{fire : function(){shootRightHandGun("shotgun"); shootLeftHandGun("handgun");}} 

Was wäre die beste/schnellste Weg, dies zu erreichen? Helferfunktionen, ein Funktionsarray im Objekt, alles. Ich bin total offen für Vorschläge.

Antwort

2

Technisch können Sie Funktionen bearbeiten, indem Sie die Funktion der Quellcode über die .toString() Methode immer dann auf sie String-Manipulationen zu tun Verwenden von Regexp usw. Aber es wäre sehr, sehr chaotisch und ich empfehle es nicht.

Stattdessen geben Sie dem Objekt ein bisschen mehr Struktur.Zuerst trennen rechte und linke Hand Waffen:

var shooter = { 
    rightHand : function() {}, 
    leftHand : function() {}, 
    fire : function() {} 
} 

nun die .fire() Methode shoot (oder Verwendung) machen alle Waffen:

var shooter = { 
    rightHandWeapon : function() {}, 
    leftHandWeapon : function() {}, 
    fire : function() { 
     this.rightHandWeapon(); 
     this.leftHandWeapon(); 
    } 
} 

Nun funktioniert der Code über nichts (da beide Funktionen nichts zu tun) Das bedeutet, dass der obige Code für einen unbewaffneten Schützen steht.

Jetzt können Sie Waffen als Funktionen implementieren:

function shotgun() { 
    /* code to fire shotgun */ 
} 

function handgun() { 
    /* code to fire handgun */ 
} 

abgeschlossen sein wir auch die folgende Funktion definieren:

function unarmed() {}; 

Jetzt können Sie den Shooter Arm von ihm die Waffen zu geben:

// Armed with shotgun 
shooter.rightHandWeapon = shotgun; 
shooter.fire(); 

// Armed with shotgun and handgun: 
shooter.rightHandWeapon = shotgun; 
shooter.leftHandWeapon = handgun; 
shooter.fire(); 

// Armed with TWO shotguns: 
shooter.rightHandWeapon = shotgun; 
shooter.leftHandWeapon = shotgun; 
shooter.fire(); 

// Disarm the shooter: 
shooter.rightHandWeapon = unarmed; 
shooter.leftHandWeapon = unarmed; 
shooter.fire(); // does nothing 
2

anhängen
var temp = shooter.fire; 
shooter.fire = (function(t){ 
    return function(){ 
    t(); 
    shootLeftHandGun("handgun"); 
    } 
})(temp); 

shooter.fire = function(){shootLeftHandGun("handgun");}; 

Fiddle zu bearbeiten: https://jsfiddle.net/trex005/4rhq7zxj/

3

Sie keine Funktionen für das Ersetzen werden sollte, anstatt den Überblick über die Elemente halten sie getrennt, wird Ihnen wahrscheinlich auf lange Sicht helfen.
Möglicherweise müssen Sie die aktuellen Elemente, die der Schütze an einem anderen Ort im Code hält, referenzieren, verschiedene Überprüfungen und Validierungen durchführen.
Ersetzen Sie nicht nur solche Funktionen.

var shooter = { 
    leftGun: null, 
    rightGun: "shotgun", 

    fire: function() { 
     if(this.rightGun != null) { 
      shootRightHandGun(this.rightGun); 
     } 
     if(this.leftGun != null) { 
      shootLeftHandGun(this.leftGun); 
     } 
    } 
} 

shooter.leftGun = "handgun"; 

Sie können später einfach den Code mit der richtigen Setter und Getter verlängern, leicht einige zusätzliche Kontrollen hinzuzufügen und so:

getRightGun: function() { return this.rightGun; } 
setRightGun: function(newRightGun) { 
    if(isProperGun(newRightGun)) {    // some kind of a check 
     this.rightGun = newRightGun; 
    } 
} 
1

Wenn Benutzer eine bessere Waffe zu finden, eine gute Möglichkeit, dies zu tun ist, Vererbung für Gun Klasse verwenden.

Beispiel in es6, aber Sie können dies ganz einfach in einem ES5 mit Prototypen:

class SimpleGun { 

    fire: function() { 
     shootLeftHandGun("handgun"); 
    } 
} 


class BetterGun extends SimpleGun { 
    fire: function() { 
     super.fire(); 
     shootRightHandGun("handgun"); 
    } 
} 

so, wenn Benutzer eine andere Waffe finden, gehen Sie einfach so etwas wie dieses:

user.setGun(new BetterGun()) 
+0

Ich glaube nicht, dass Jason beide Waffen so zusammenfassen will, aber ansonsten scheint es auch eine gute Idee zu sein. – lauriys

+0

Ich stimme zu, es hängt davon ab, was genau Jason erreichen will (es gibt nicht genug Informationen über alle anderen Entitäten) und es hängt auch von der Größe der Anwendung ab. Wenn es groß wird, ist es besser, über Architektur nachzudenken, aber wenn es nur eine kleine App ist, brauchst du wahrscheinlich keine Klassen und anderes Zeug. –

+0

Um zu klären. Ich möchte Optionen, und Ihre Antwort bietet das. –

1

Solange Da Ihr Objekt kein Funktionskonstruktor ist und nur ein einfaches Objekt wie dieses ist, können Sie es einfach direkt hinzufügen, was Sie wollen (Eigenschaften, Methoden):

shooter.shootLeftHandGun = fucntion() {// Your code here. } 

Wenn Ihr Shooter jedoch von einem Funktionskonstruktor erstellt wurde (was in Ihrem Fall nicht der Fall ist), können Sie dies einfach durch den Prototyp Ihres Objekts tun.

shooter.prototype.shootLeftHandGun = function() {// Your code here.} 

anstatt einfach Ihr Objekt on the fly erstellen, versuchen Sie dies mit:]

function shooter() { 
    this.shootRightHandGun = function() { 
     // Code 
    } 
    this.name = "default name" 
} 

var newShooter = new shooter(); 
newShooter.prototype.shootLeftHandGun = function() { // Your new stuff.} 
+0

Aber, Aber, Aber, wenn dein shootLeftHandGun etwas wiederverwendbar sein wird (kann von anderen Objekten auch genommen werden, ziehe ich es vor, ein Helfer-Objekt zu erstellen, das alle verschiedenen Arten von Pistolen hält!) Auf diese Weise kannst du die richtige Funktion in dein Shooter-Objekt injizieren wenn sie eine neue Waffe erreichen. Interessante Frage jedenfalls :) –

1

Dies ist eine weitere Alternative:

1

Es sieht aus wie jeder hier anhäuft, was cool ist. Hier ist mein Versuch. Wenn eine Waffe in einer Hand bereits ausgerüstet ist, ist diese Hand besetzt und der Benutzer wird darüber informiert. Ich fügte auch eine fireAllGuns Funktion für den Spaß davon hinzu.

var shooter = { 
    guns: {}, 
    fire: function(hand) { 
    if (this.guns[hand]) { 
     console.log("Firing " + this.guns[hand] + " from " + hand + " hand!"); 
    } else { 
     console.log("There is no gun in that hand!") 
    } 
    }, 
    fireAllGuns: function() { 
    for (var key in this.guns) { 
     if (this.guns.hasOwnProperty(key)) { 
     console.log("Firing " + this.guns[key] + " from " + key + " hand!");  
     } 
    } 
    }, 
    equipGun: function(hand, gun_name) { 
    if (!this.guns[hand]) { 
     this.guns[hand] = gun_name; 
     console.log("Equipped " + gun_name + " in " + hand + " hand"); 
    } else { 
     console.log("That hand is already occupied!") 
    } 
    } 
}; 

shooter.fire("left"); 
// There is no gun in that hand! 

shooter.equipGun("left", "pistol"); 
// Equipped pistol in left hand 

shooter.fire("left"); 
// Firing pistol from left hand! 

shooter.fire("right"); 
// There is no gun in that hand! 

shooter.equipGun("right", "bazooka"); 
// Equipped bazooka in right hand 

shooter.fire("right"); 
// Firing bazooka from right hand! 

shooter.fireAllGuns(); 
// Firing pistol from left hand! 
// Firing bazooka from right hand! 
+0

Was macht diese Linie? 'für (var key in this.guns)'. –

+1

Ich wiederhole eine 'for/in'-Schleife. Der Schlüssel ist die Hand und der Wert ist der Name der Waffe. Sieh dir die Aufgabe in der 'equipGun' Funktion an:' this.guns [hand] = gun_name; ' –

Verwandte Themen