我目前制作的游戏结构很小:
let Game = function() {
let privateVar;
// private would be an example private variable assigned later
// Other private variables go here
return {
Engine: function() {
// More specific private variables
init: function() {
privateVar = this.sampleValue;
// Game.Engine.sampleValue doesn't help either
// Start up everything, for example, calling a Graphics method:
Game.Graphics.method1();
},
sampleValue: 10,
// Other methods
}
Graphics: Graphics()
}
}
function Graphics() {
// Visuals-specific private variables
return {
method1: function() {
console.log(privateVar);
// This would complain about the variable not being defined
}
// methods
}
}
Game.Engine.Init();
想法是通过调用Graphics()
方法中的Graphics
函数将可视代码与内部代码分开(因此我可以在单独的文件中构建Graphics()
函数例如)。但是,当我执行此操作时,Graphics
方法会丢失我在开头声明并在init
方法中分配的私有变量,并且只要它被调用,就会吐出Uncaught ReferenceError: private is not defined
Graphics
中的一些方法。
我想一个解决方案就是重新分配Graphics()
中的那些私有,但这有点会破坏目的。谁有更好的主意?提前谢谢。
编辑:让代码更容易理解我在
获得的内容答案 0 :(得分:0)
如果您想要私有变量,您的Graphics类型不应该访问它们。如何改为声明公共变量?
比如说:
let Game = function() {
this.publicVar = "value";
}
或者您可以声明getter访问私有字段并将Game实例传递给Graphics类型。像这样:
let Game = function() {
let privateVar = "value";
this.getPrivateVar = function() {
return privateVar;
}
}
function Graphics(game) {
// ...
}
答案 1 :(得分:0)
我认为您正在尝试使用O.O.在javascript中。 Javascript是原型,所以,你将使用O.O.与通常的语言不同。 see mozilla reference
我认为你应该创建像这样的js类:
/**
* @class Game Class
*/
function Game() {
this.privateProperty;
this.engine = new Engine(); //engine object of this game
this.graphics = new Graphics(); //graphics object of this game
}
Game.prototype.oneGameMethod = function(){
};
/**
* @class Engine Class
*/
function Engine(){
this.privateProperty;
}
Engine.prototype.oneEngineMethod = function(){
};
/**
* @class Graphics class
*/
function Graphics() {
// Visuals-specific private variables
this.visualProperty;
}
Graphics.prototype.oneMethodExample = function(){
};
您可以创建一个Game对象并调用其方法等等:
var myGame = new Game();