我正在学习基于javascript的PHASER HTML5游戏开发框架, 在此期间,我遇到了一段我无法理解的代码
var BunnyDefender = {};
BunnyDefender.Boot = function(game) {};
BunnyDefender.Boot.prototype = {
preload: function()
{
//-----to load objects and units before we begin our game
this.load.image('preloadbar', 'images/loader_bar.png');
this.load.image('titleimage', 'images/TitleImage.png');
},
create: function()
{
this.input.addPointer();
this.stage.backgroundColor = '#171642';
this.state.start('Preloader'); // launches preloader from Boot.js
}
};
从我学到的关于javascript原型的知识来看,为了向对象或构造函数添加任何方法,我们使用了以下语法/示例:
function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}
var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null;
fred.salary=20000;
请帮助!!!
答案 0 :(得分:1)
因此,根据我对该问题的理解,您不清楚javascript中的静态方法/属性。
可以随时调用静态方法,而无需创建类的new
实例。静态方法只是相关的代码,可以执行某些操作,例如配置类或维护设计模式,例如创建/返回类的单例实例。
// Constructor
var BunnyDefender = {};
// Prototype declarations
BunnyDefender.prototype = { ... }
// Static method implementing a crude singleton
BunnyDefender.Boot = function() {
// Check if the static property _instance exists
// if it doesn't. Create it one time only, thus our
// BunnyDefender singleton is born.
if ( ! BunnyDefender._instance )
BunnyDefender._instance = new BunnyDefender();
// Return the already created instance of BunnyDefender
return BunnyDefender._instance;
};
由于Boot
是类BunnyDefender
的静态方法,我们可以在不创建新的bunny defender实例的情况下调用它。
var bunnyDefender = BunnyDefender.Boot();
您可以在javascript教程/文档中阅读有关静态属性/方法的更多信息,例如this article。
答案 1 :(得分:0)
当使用新陈述时。
var myobject = new BunnyDefender.boot();
原型的所有原型属性/对象,(或以编程术语表示,继承自),新对象。
例如,假设我将一个prototype属性添加到继承链末尾的prototype属性中。
Object.prototype.myproperty = true;
现在我创建的任何对象都将继承myproperty。
var a={}; /* object literal equiv to new Object(); */
document.write(a.myproperty); /* true */
我可以更改我的对象的myproperty,该对象在我的对象下创建myproperty,但不会更改prototype.myproperty。 a.myproperty是读/写的,但如果它不存在,它会从继承中读取以查找属性。
这允许我们做的是创建一个我可以使用新语句复制的API。创建的新对象不会干扰使用相同构造函数创建的任何其他对象。
代码中的某处我希望有一个
var newgame = var new BunnyDefender.boot();
我不确定他们为什么要在游戏中使用这种方法?我之所以使用这种方法,是因为我想要使用相同API / lib的大量对象,但是由于该对象还包含特定属性,例如某个特定HTML元素的属性。
也许每个兔子都是自己的对象?
var bunny1 = var new BunnyDefender.boot();
var bunny2 = var new BunnyDefender.boot();
每个兔子都会得到一个完整的API,可以使用this.referance。分享相同的图像等。如果它是一个狩猎游戏,每个兔子可以位于屏幕上的不同位置,吃后会有不同的品质,等等。兔子2会发生什么影响兔子1。
使用大写字母启动函数通常是指示它是一个构造函数。