Javascript函数原型设计?

时间:2014-08-24 09:54:46

标签: javascript phaser-framework

我正在学习基于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;

请帮助!!!

2 个答案:

答案 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。

使用大写字母启动函数通常是指示它是一个构造函数。