基于其他属性更新JS“class”的属性?

时间:2016-11-13 05:46:54

标签: javascript class get physics-engine

我对Javascript比较陌生,我正在尝试为我正在开发的游戏类型项目创建一个非常简单的物理引擎。为了做到这一点,我创建了我理解为JS的等效类,我可以为我想要的每个对象创建新副本。问题是我希望能够更新诸如x位置之类的值,并且还要更新诸如x Middle位置(x屏幕上的对象中心)之类的内容。我知道这可以通过使用对象文字和getter来实现,但是我希望能够根据屏幕上的内容实时创建新对象,而我无法弄清楚如何使用get来使其工作。以下是我想要做的一般想法:

var object = function (xPos, yPos, width, height) {
  this.xPos = xPos;
  this.yPos = yPos;
  function getXMid (xP) { return xP + width/2; }
  this.xMid = getXMid (this.xPos);
  function getYMid (yP) { return yP + height/2; }
  this.yMid = getYMid (this.yPos);
}

var ball = new object (10, 20, 50, 50);
ball.xPos = 50;
console.log (ball.xMid); // want this to output 75 instead of 45

1 个答案:

答案 0 :(得分:0)

您正在更改一个属性,并期望其他属性更新,但遗憾的是,当属性保存原始值时,它不会以这种方式工作。

设置值

时,可以使用setter和getter以及函数来更新其他属性



var object = function(xPos, yPos, width, height) {
    this._xPos  = xPos;
    this._yPos  = yPos;
    this.recalc = function() {
    	this.xMid = getXMid(this.xPos);
        this.yMid = getYMid(this.yPos);
    }
    
    Object.defineProperty(this, 'xPos', {
        get: function() {
            return this._xPos;
        },
        set: function(v) {
        	this._xPos = v;
        	this.recalc();
        }
    });

	Object.defineProperty(this, 'yPos', {
        get: function() {
            return this._yPos;
        },
        set: function(v) {
        	this._yPos = v;
        	this.recalc();
        }
    });
    
    function getXMid(xP) { return xP + width / 2; }
    
    function getYMid(yP) { return yP + height / 2; }
    
    this.recalc();
}

var ball = new object(10, 20, 50, 50);
ball.xPos = 50;
console.log (ball.xMid); // want this to output 75 instead of 45