2017-10-21 23 views
0

這是我的主要代碼:無法調用一個函數,它是一類外,而被VM上下文中

const intents = {}; 

const characters = [ 
    new Character(0, 400, 300), 
    new Character(1, 500, 200) 
]; 

const vmContextMethods = require('./vm/context_methods.js')(characters); 

const vmContext = { 
    'intents': intents, 
    'game': Object.freeze(vmContextMethods) 
}; 

vm.createContext(vmContext); 
vm.runInContext('characters[0].test();', vmContext, { displayErrors: true }); 

這裏的context_methods.js:

module.exports = function(characters) { 
    const module = { 
     characters 
    } 

    return module; 
} 

這裏的字符類:

class Character { 
    constructor(id, x, y) { 
     this.id = id; 
     this.x = x; 
     this.y = y; 
    } 

    test() { 
     intents.test = true; 
    } 
} 

module.exports = Character; 

我將意圖對象和字符對象傳遞給VM上下文但我無法引用從角色實例中提取意圖。

我能夠引用字符實例外的意圖,但不能從內部引用。

我的直覺是有一些上下文/範圍問題,因爲當我測試添加console.log(123);在類中,當所有來自類外部的console.log()調用都發送到我的客戶端控制檯時(我將自定義控制檯對象傳遞給發送該虛擬機的虛擬機上下文),將123發送到我的服務器控制檯,而不是客戶端控制檯消息通過socket.io發送到客戶端)。

我需要的東西是整個vm上下文的頂級上下文。如窗口,所以我可以使用遊戲對象(編輯)內的「window.intents」

+0

在這種情況下使用上下文開始的目標是什麼?你的'Character'對象是在外部上下文中創建的,所以你在上下文中使'intents'成爲全局的事實對它沒有任何影響。 – loganfsmyth

+0

我試圖將兩個不同的對象傳遞給VM上下文,意圖和字符實例。我想要字符實例能夠引用intents對象。我怎樣才能做到這一點?我嘗試了幾種不同的東西,但沒有雪茄。 – unska

+0

由於該類是在上下文之外聲明的,所以'intents'對象從上下文之外的全局加載。您將對象的引用傳遞給在上下文中運行的代碼,但這不會改變「Character」實例的行爲方式。爲什麼這需要成爲一個全球性的?您可以輕鬆地將intents對象傳遞給'Character'實例並完全避免全局。 – loganfsmyth

回答

0

我將intents對象移動到Character類。不完全是答案,但我想我最初的想法很糟糕。

相關問題