Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Конструктор объекта (https://javascript.ru/forum/misc/73503-konstruktor-obekta.html)

VyacheslavBozere 20.04.2018 18:56

Конструктор объекта
 
Всем привет! Изучаю 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)));

Rise 20.04.2018 21:53

Что за полукод? Где собственно вызов класса?

VyacheslavBozere 20.04.2018 22:39

Цитата:

Сообщение от Rise (Сообщение 483730)
Что за полукод? Где собственно вызов класса?

(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)));

Rise 21.04.2018 01:13

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)));

VyacheslavBozere 21.04.2018 03:46

Ваше решение лучше. Но вопрос был в другом, почему же в одном случае, когда использую сеттер консоль не ругается, а во втором случае, когда записываю конструктор в методе плюс, он у меня закоментированный, консоль ругается , что это не конструктор. Как бы мне это понять ?

(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)));

Rise 21.04.2018 07:46

Потому что название конструктора и параметра метода совпадают.

VyacheslavBozere 21.04.2018 14:55

Цитата:

Сообщение от Rise (Сообщение 483739)
Потому что название конструктора и параметра метода совпадают.

Но если я передам в него числа 1, 2 или другие переменные, то тоже вылазит ошибка, что конструктор не обьявлен.

Rise 21.04.2018 15:49

Метод это plus(Vektor), параметр его это Vektor, переименуйте параметр на отличный от имени класса, например plus(vektor). Значения параметров это аргументы.
function V(x, y) {} // x, y - параметры
V(1, 2) // 1, 2 - аргументы

VyacheslavBozere 21.04.2018 16:01

Огромнейшее спасибо!

Rise 21.04.2018 16:06

И у вас это не сеттер, не в переносном (состояние объекта не изменяется) не в прямом смысле (синтаксис "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.