2012-09-29 29 views
2

嗨我有3個javascript文件:Game.js,Player.js,Drawable.js。 現在在Game.js中,我想要創建一個對象_player,即Drawable,而不是Player。這意味着_player是一個Player對象,這是一個EXTENDS可繪製的類。Javascript繼承3個分隔文件

Drawable.js

function Drawable(x, y, src) 
{ 
    this.x = x; 
    this.y = y; 
    this.img = new Image(); 
    this.img.src = src; 
    this.width = this.img.width; 
    this.height = this.img.height; 

    this.draw = function(canvas) 
    { 
    canvas.drawImage(this.img,this.x, this.y); 
    } 

    this.midpoint = function() 
    { 
    return { 
     x: this.x + this.width/2, 
     y: this.y + this.height/2}; 
    } 

    } 
} 

Player.js

function Player() 
{ 
    this.moveLeft = function() 
    { 
    this.x -= 3; 
    } 

    this.moveRight = function() 
    { 
    this.x += 3; 
    } 

    this.moveUp = function() 
    { 
    this.y -= 3; 
    } 

    this.moveDown = function() 
    { 
    this.y += 3; 
    } 
} 

Game.js

var _player; 

_player = new Player(); 

_player.draw(...); 
_player.moveLeft(); 
... 
... 

這就是我想要的去做。我試圖把Player.prototype = new Drawable;但它不起作用。我能怎麼做?

回答

1

如果您想要的球員對象的行爲,這樣你可以調用

player.draw(...); 
player.moveLeft(...); 

則需要被存儲在每個玩家的對象(亞克西)在玩家對象的原型鏈性質或其他地方的drawmoveLeft功能。

這對您的實際代碼提出了一條評論:這些函數應該在原型中,而不是實際的對象。

因此,要回答你的實際的問題...

  • 你應該做的第一件事是把原型中的方法。

  • 然後,您需要將玩家原型的原型作爲所有繪圖的原型。

這聽起來令人困惑,但這裏是錢就行:

Player.prototype = Object.create(Drawable.prototype); 

做這個之前創建球員new Player。 :)

附錄

Live Demo - 這也說明你如何做「構造」的事情,所以你可以建立一個初始x和y的球員。

1

Coffeescript是一種語言,它具有基於類的對象模型,該模型位於javascript原型對象模型的頂部。在它們的頁面上,當編譯爲javascript時,您可以在coffeescript中看到一個示例how the extends keyword works

1

它可能不是您的考慮因素。也許這不是你曾經想過的任何事情,但爲什麼不建立一個Drawable組件,你可以通過依賴注入來給玩家一個Drawable組件,無論是在構建過程中,還是在不久之後。

var Drawable = function() { ... }; 
var Player = function() { ... }; 


var player = new Player(new Drawable(), new Controlable(), new Physical());