2016-06-12 4 views
1

Я пытаюсь динамически установить функцию прототипа, используя new Function(...). Я попробовал следующее (ES6):Установить прототип Javascript динамически

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

использования: У меня есть микро-сервис, который хранит алгоритмы как ресурс, который затем будет принят в тренажере, который сражается 2 алгоритма.

при попытке это, this.prototype есть undefined. Единственная причина, по которой я могу думать, что это может быть так, потому что объект AI не полностью определен до завершения выполнения конструктора.

Как я могу установить функцию прототипа, как я пытаюсь здесь?

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

Планируете ли вы использовать AI только для одного экземпляра объекта? – trincot

+0

Я добавил к моему правлению пример использования, а также обновление. – frankgreco

+0

Будет один экземпляр AI за игру, и в симуляции будет много игр. – frankgreco

ответ

3

Когда конструктор вызывается у вас уже есть экземпляр объекта, который вы создаете, и, таким образом, вы можете просто изменить методы экземпляра, не касаясь прототипа:

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

Это работает! Таким образом, три функции добавляются затем в AI.prototype – frankgreco

+1

@Frank Нет, они добавляются к экземпляру, который конструктор, ну, конструирует. Прототип остается нетронутым. – Schlaus

+0

@ jfriend00: По-видимому, 'algObj' содержит строки кода, иначе это не сработает. Почему это так, и хорошо ли это, мы лучше обсудим в другом месте. – Bergi

Смежные вопросы