20.04.2018, 18:56
|
Аспирант
|
|
Регистрация: 18.03.2018
Сообщений: 31
|
|
Конструктор объекта
Всем привет! Изучаю 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)));
Последний раз редактировалось VyacheslavBozere, 20.04.2018 в 22:38.
|
|
20.04.2018, 21:53
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
Что за полукод? Где собственно вызов класса?
|
|
20.04.2018, 22:39
|
Аспирант
|
|
Регистрация: 18.03.2018
Сообщений: 31
|
|
Сообщение от Rise
|
Что за полукод? Где собственно вызов класса?
|
(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)));
Последний раз редактировалось VyacheslavBozere, 21.04.2018 в 03:47.
|
|
21.04.2018, 01:13
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
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)));
Последний раз редактировалось Rise, 21.04.2018 в 01:25.
|
|
21.04.2018, 03:46
|
Аспирант
|
|
Регистрация: 18.03.2018
Сообщений: 31
|
|
Ваше решение лучше. Но вопрос был в другом, почему же в одном случае, когда использую сеттер консоль не ругается, а во втором случае, когда записываю конструктор в методе плюс, он у меня закоментированный, консоль ругается , что это не конструктор. Как бы мне это понять ?
(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)));
Последний раз редактировалось VyacheslavBozere, 21.04.2018 в 03:50.
Причина: Опечатка
|
|
21.04.2018, 07:46
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
Потому что название конструктора и параметра метода совпадают.
|
|
21.04.2018, 14:55
|
Аспирант
|
|
Регистрация: 18.03.2018
Сообщений: 31
|
|
Сообщение от Rise
|
Потому что название конструктора и параметра метода совпадают.
|
Но если я передам в него числа 1, 2 или другие переменные, то тоже вылазит ошибка, что конструктор не обьявлен.
|
|
21.04.2018, 15:49
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
Метод это plus(Vektor), параметр его это Vektor, переименуйте параметр на отличный от имени класса, например plus(vektor). Значения параметров это аргументы.
function V(x, y) {} // x, y - параметры
V(1, 2) // 1, 2 - аргументы
Последний раз редактировалось Rise, 21.04.2018 в 16:02.
|
|
21.04.2018, 16:01
|
Аспирант
|
|
Регистрация: 18.03.2018
Сообщений: 31
|
|
Огромнейшее спасибо!
|
|
21.04.2018, 16:06
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,662
|
|
И у вас это не сеттер, не в переносном (состояние объекта не изменяется) не в прямом смысле (синтаксис "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);
|
|
|
|