2016-06-12 35 views
1

Ich versuche, eine Prototypfunktion dynamisch unter Verwendung new Function(...) zu setzen. Ich habe die folgenden (es6) versucht:Javascript-Prototyp dynamisch setzen

export default class AI { 

    constructor(algObj, player) { 
     this.player = player; 
     this.algObj = algObj; 

     //create the shoot and placeShips prototypes form the this.algObj property 
     this.prototype.initialize = new Function(this.algObj.initialize); 
     this.prototype.shoot  = new Function(this.algObj.shoot); 
     this.prototype.placeShips = new Function(this.algObj.placeShips); 

     this.initialize(); 
    } 
} 

USE CASE: Ich habe eine Mikro-Service haben, die Algorithmen wie die Ressource speichert, die dann in einen Simulator übergeben werden, die zwei Algorithmen Schlachten.

Wenn ich dies versuche, ist this.prototypeundefined. Der einzige Grund, warum ich denken könnte, dass dies der Fall ist, ist, dass das Objekt AI erst nach der Ausführung des Konstruktors vollständig definiert ist.

Wie würde ich eine Prototypfunktion einstellen, wie ich hier versuche?

UPDATE:

this.__proto__.initialize = new Function(this.algObj.initialize); 
this.__proto__.shoot  = new Function(this.algObj.shoot); 
this.__proto__.placeShips = new Function(this.algObj.placeShips); 
+0

Planen Sie, AI nur für eine Objektinstanz zu verwenden? – trincot

+0

Ich habe einen Bearbeitungsfall zu meiner Bearbeitung hinzugefügt und ein Update hinzugefügt. – frankgreco

+0

Es wird pro Spiel eine KI-Instanz geben und es wird mehrere Spiele pro Simulation geben. – frankgreco

Antwort

3

Wenn der Konstruktor aufgerufen wird bereits eine Instanz des Objekts haben Sie erstellen, und daher kann man einfach die Instanz Methoden modifizieren, ohne den Prototyp zu berühren:

export default class AI { 

    constructor(algObj, player) { 
     this.player = player; 
     this.algObj = algObj; 

     //create the shoot and placeShips prototypes form the this.algObj property 
     this.initialize = new Function(this.algObj.initialize); 
     this.shoot  = new Function(this.algObj.shoot); 
     this.placeShips = new Function(this.algObj.placeShips); 

     this.initialize(); 
    } 
} 
+0

Das funktioniert! Also werden die 3 Funktionen zu AI.prototype – frankgreco

+1

@Frank No hinzugefügt, sie werden zu der Instanz hinzugefügt, die der Konstruktor ist, nun, Konstruieren. Der Prototyp bleibt unberührt. – Schlaus

+0

@ jfriend00: Anscheinend enthält "algObj" Code-Strings, sonst würde es nicht funktionieren. Warum das so ist, und ob das eine gute Idee ist, diskutieren wir lieber woanders. – Bergi

Verwandte Themen