Конструктор объекта
Всем привет! Изучаю JavaScript и столкнулся с недопониманием темы.
Нужно что бы метод plus объекта Vektor вернул сумму двух объектов новым объектом Vektor. Почему через функцию set ошибка не выводится. А если просто объявить конструктор, то выводится. Подскажите пожалуйста. (function() { class Vektor { constructor(x, y){ this.x = x; this.y = y; } set(value1, value2) { return new Vektor(value1, value2);// Ошибки нет } plus(Vektor){ /*let newVektor = new Vektor(Vektor.x, Vektor.y); //Ошибка Vektor не конструктор.*/ let a = this.x + Vektor.x; let b = this.y + Vektor.y; Vektor = Vektor.set(a, b);//При использовании сеттера return Vektor; } } console.log(new Vektor(1, 2).plus(new Vecktor(2, 3))); |
Что за полукод? Где собственно вызов класса?
|
Цитата:
(function() { class Vektor { constructor(x, y){ this.x = x; this.y = y; } set(value1, value2) { return new Vektor(value1, value2);// Ошибки нет } plus(Vektor){ /*let newVektor = new Vektor(Vektor.x, Vektor.y); //Ошибка Vektor не конструктор.*/ let a = this.x + Vektor.x; let b = this.y + Vektor.y; Vektor = Vektor.set(a, b);//При использовании сеттера return Vektor; } } console.log(new Vektor(1, 2).plus(new Vektor(2, 3))); |
Vecktor неправильно написано
class Vector1 { constructor(x, y) { this.x = x; this.y = y; } add(vector) { this.x += vector.x; this.y += vector.y; return this; } } class Vector2 { constructor(x, y) { this.x = x; this.y = y; } static add(vector1, vector2) { return new this(vector1.x + vector2.x, vector1.y + vector2.y); } } console.log('Vector1', new Vector1(1, 2).add(new Vector1(2, 3))); console.log('Vector2', Vector2.add(new Vector2(1, 2), new Vector2(2, 3))); |
Ваше решение лучше. Но вопрос был в другом, почему же в одном случае, когда использую сеттер консоль не ругается, а во втором случае, когда записываю конструктор в методе плюс, он у меня закоментированный, консоль ругается , что это не конструктор. Как бы мне это понять ?
(function() { class Vektor { constructor(x, y){ this.x = x; this.y = y; } [COLOR="Yellow"]set(value1, value2) { return new Vektor(value1, value2);// Ошибки нет[/COLOR] } plus(Vektor){ [COLOR="Yellow"]/*let newVektor = new Vektor(Vektor.x, Vektor.y); //Ошибка Vektor не конструктор.*/[/COLOR] let a = this.x + Vektor.x; let b = this.y + Vektor.y; Vektor = Vektor.set(a, b);//При использовании сеттера return Vektor; } } console.log(new Vektor(1, 2).plus(new Vektor(2, 3))); |
Потому что название конструктора и параметра метода совпадают.
|
Цитата:
|
Метод это plus(Vektor), параметр его это Vektor, переименуйте параметр на отличный от имени класса, например plus(vektor). Значения параметров это аргументы.
function V(x, y) {} // x, y - параметры V(1, 2) // 1, 2 - аргументы |
Огромнейшее спасибо!
|
И у вас это не сеттер, не в переносном (состояние объекта не изменяется) не в прямом смысле (синтаксис "set property()" не используется), а скорее фабрика (альтернативный вариант конструктора).
class Vector { constructor(x, y) { this.x = x; this.y = y; } clone() { return new this.constructor(this.x, this.y); } static add(vector1, vector2) { return new this(vector1.x + vector2.x, vector1.y + vector2.y); } } // Варианты создания Vector: let a = new Vector(1, 2); // 1 let b = new Vector(2, 3); // 1 let c = a.clone(); // 2 let d = Vector.add(a, b); // 3 console.log(a, b, c, d); |
Часовой пояс GMT +3, время: 22:31. |