Search code examples
javascriptclassobjectprototype

How to set new values to a class


I have a rectangle class and I want to use shift to assign new values to this.x and this.y by the shift amount. For example, the coordinates were assigned (5,5) r.shift(3,3) will make this.x and this.y (3,3). Currently, my code makes x and y new values, it doesn't reassign them. How would I go on to do so?

class Rectangle {
  constructor(x, y, width, height){
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
  }
}

Rectangle.prototype.shift = function (changeInX, changeInY) {
  this.x = changeInX
  this.y = changeInY
}
//returns value string
Rectangle.prototype.toString = function () {
  return 'x is ' + this.x + ', y is ' + this.y + ', width is ' + this.width + ', height is ' + this.height
}
//offsets coordinates by amount
Rectangle.prototype.offset = function (changeInX, changeInY) {
 return new Rectangle(this.x+changeInX, this.y+changeInY, this.width, this.height)
}

Solution

  • You need to use += instead of just = to increment this.x in your shift function.

    e.g.:

      this.x += changeInX
      this.y += changeInY
    

    Full modified example:

    class Rectangle {
      constructor(x, y, width, height){
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
      }
    }
    
    Rectangle.prototype.shift = function (changeInX, changeInY) {
      this.x += changeInX
      this.y += changeInY
    }
    //returns value string
    Rectangle.prototype.toString = function () {
      return 'x is ' + this.x + ', y is ' + this.y + ', width is ' + this.width + ', height is ' + this.height
    }
    //offsets coordinates by amount
    Rectangle.prototype.offset = function (changeInX, changeInY) {
     return new Rectangle(this.x+changeInX, this.y+changeInY, this.width, this.height)
    }
    
    const rect = new Rectangle(1, 2, 3, 4);
    console.log('before:', rect.toString())
    rect.shift(100, 200);
    console.log('after:', rect.toString())