Куда делись скобки после функций типа this в js?
недавно, вызвав функцию 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 шт):
если я пишу без скобок
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);
У вас в вопросе, кажется, две путаницы.
Со скобками можно вызвать только то, что является функцией. Чаще всего свойство
lengthне является функцией, поэтому скобки при нем не нужны.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);