Как получить переменную в объекте

307
07 ноября 2021, 05:40

Нужно создать объект описывающий прямоугольник двумя точками(верхний левый и правый нижний угол). Далее нужно написать функцию, которая принимает обьект прямоугольник и возражает его сторону , далее нужно написать функцию которая принимает обьект прямоугольник и на сколько изменить его ширину

let rectangle = {
    x1: 0,
    y1: 10,
    x2: 10,
    y2: 2,
};
rectangle.returnWeight = function(){ 
      let weight =  Math.abs(this.x2) - Math.abs(this.x1);
      alert(`Ширина прямоугольника равна ${weight}`);
      return weight;
};
//Метод для определения ширины 
rectangle.changeWeight = function(parametr){
       let newWeight =  (Math.abs(this.x2) - Math.abs(this.x1)) + parametr;
       alert(`Ширина прямоугольника была = ${weight} , а стала = ${newWeight}`);
       return newWeight;
};

Как написать метод который изменяет ширину . У меня возникла проблема , новый метод changeWeight не видит переменную из метода weight. Конечно можно сделать метод таким образом что я просто как в методе returnWeight измеряю ширину текущего прямоугольника , а затем просто добавляю параметр к этой ширине. Но мне интересно как это можно сделать ещё. Можно ли получить доступ к этой переменной weight или может стоит инициализировать эту переменную в самом объекте , а в методе просто её взять

Я решил сделать так

rectangle.changeWeight = function(parametr){
       this.x2 += parametr;
       let newWeight =  Math.abs(this.x2) - Math.abs(this.x1);
       alert(`Новая ширина прямоугольника ${newWeight}`);
       return newWeight;
};
Answer 1

объедините все в один объект - удобно читать и есть общая область видимости:

const rect = {
  _x: [],
  _y: [],
  getWidth: function () {
    return this._x[1] - this._x[0]
  },
  setCoord: function (coordinate) {
    const {x,y} = coordinate;
    this._x = x.sort()
    this._y = y.sort()
  },
  setWidth: function (width) {
    this._x[1] = this._x[0] + Math.abs(width);
  }
}

Добавить метод установки координат показалось логичным, но вы можете изменить пример под свой вариант использования. Проверим работоспособность:

rect.setCoord({x: [5,2], y: [7,15]});
console.log(rect.getWidth()); //3
rect.setWidth(5);
console.log(rect.getWidth()); //5
rect.setCoord({x: [-10, 3], y: [2,12]});
console.log(rect.getWidth()); //13
rect.setWidth(8);
console.log(rect.getWidth()); //8
rect.setCoord({x: [5, 3], y: [-2,12]});
console.log(rect.getWidth()); //2
rect.setWidth(4);
console.log(rect.getWidth()); //4
Answer 2
alert(`Ширина прямоугольника была = ${this.returnWeight()} , а стала = ${newWeight}`);

Но лучше в методах ничего не алертить. Сделай так чтоб методы просто возвращали значения

rectangle.returnWeight = function(){  
      return Math.abs(this.x2) - Math.abs(this.x1);
};
//Метод для определения ширины 
rectangle.changeWeight = function(parametr){
       return (Math.abs(this.x2) - Math.abs(this.x1)) + parametr;
};
alert(`Ширина прямоугольника была = ${rectangle.returnWeight()} , а стала = ${rectangle.changeWeight()}`);
READ ALSO
Цепочка наследования

Цепочка наследования

Нужна помощь с реализацией такой вот задачи - функция должна принять массив функций и соединить их в цепочку наследования, после чего новый...

246
Что означает запись, которая напоминает массив, но используется на месте имени константы

Что означает запись, которая напоминает массив, но используется на месте имени константы

Доброе утроНадо срочно разобраться в коде, а JavaScript только начинаю изучать

166
динамическое обновление страницы AJAX, JQuery

динамическое обновление страницы AJAX, JQuery

Есть два AJAX скрипта, один добавляет в БД, другой выводит из БД, они оба работают

168