0

недавно, вызвав функцию length, как обычно, со скобками, словил ошибку. Посидев некоторое время пришел к выводу, что скобки надо убрать - все заработало. Но сегодня столкнулся с следующей проблемой: я не могу вызвать свою функцию с this. Пример:

const Cube = {
    height : 100,
    width : 100,
    dipth : 100,
    position : { x : 10, y : 10, z : 10 },
};

const Move = this.Move = (sX, sY, sZ) => { this.position.x += sX; this.position.y += sY; this.position.z += sZ; };

Cube.Move(10, 0, 0);

итогом выдает ошибку: Uncaught TypeError: Cube.Move is not a function Но если я пишу без скобок Cube.Move;, ошибок ,соответственно, нет.

2 Answers2

2

если я пишу без скобок Cube.Move;, ошибок ,соответственно, нет.

Ну, если цель - только чтобы не было ошибок, то все в порядке.


Вы не показали код с length, но, если речь о строке/коллекции/массиве, то это свойство, а не метод. Поэтому никакие скобки не нужны.


const Cube = {
  height: 100,
  width: 100,
  depth: 100,
  position: { x: 10, y: 10, z: 10 }
};

Cube.Move = function(sX, sY, sZ) { this.position.x += sX; this.position.y += sY; this.position.z += sZ; };

Cube.Move(10, 0, 0); console.log(Cube.position);

или сразу при объявлении объекта:

const Cube = {
  height: 100,
  width: 100,
  depth: 100,
  position: { x: 10, y: 10, z: 10 },
  Move: function(sX, sY, sZ) {
    this.position.x += sX;
    this.position.y += sY;
    this.position.z += sZ;
  }
};

Cube.Move(10, 0, 0); console.log(Cube.position);

1

У вас в вопросе, кажется, две путаницы.

  1. Со скобками можно вызвать только то, что является функцией. Чаще всего свойство length не является функцией, поэтому скобки при нем не нужны.

  2. this равняется родительскому объекту только внутри его функций вызванных как методы. Вне методов объекта, в глобальной области видимости this равняется чаще всего или глобальному объекту (window), или undefined, в зависимости от режима strict. В вашем случае скорее всего функция присваивалась window, поэтому она не находилась в Cube.

Вдобавок стрелочные функции не стоит использовть как методы, потому что this в них не будет равно родительскому объекту.

Поэтому в вашем случае скорее всего нужно так:

const Cube = {
    height : 100,
    width : 100,
    dipth : 100,
    position : { x : 10, y : 10, z : 10 },
};

Cube.Move = function(sX, sY, sZ) { this.position.x += sX; this.position.y += sY; this.position.z += sZ; };

Cube.Move(10, 0, 0);

console.log(Cube);

vsemozhebuty
  • 14,042