Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.04.2018, 18:56
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 20.04.2018, 21:53
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Что за полукод? Где собственно вызов класса?
Ответить с цитированием
  #3 (permalink)  
Старый 20.04.2018, 22:39
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 21.04.2018, 01:13
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 21.04.2018, 03:46
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 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. Причина: Опечатка
Ответить с цитированием
  #6 (permalink)  
Старый 21.04.2018, 07:46
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Потому что название конструктора и параметра метода совпадают.
Ответить с цитированием
  #7 (permalink)  
Старый 21.04.2018, 14:55
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 18.03.2018
Сообщений: 31

Сообщение от Rise Посмотреть сообщение
Потому что название конструктора и параметра метода совпадают.
Но если я передам в него числа 1, 2 или другие переменные, то тоже вылазит ошибка, что конструктор не обьявлен.
Ответить с цитированием
  #8 (permalink)  
Старый 21.04.2018, 15:49
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 21.04.2018, 16:01
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 18.03.2018
Сообщений: 31

Огромнейшее спасибо!
Ответить с цитированием
  #10 (permalink)  
Старый 21.04.2018, 16:06
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 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);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Config и конструктор объекта AirGraph ExtJS 5 12.09.2015 16:12
Конструктор как свойство объекта kenrike Общие вопросы Javascript 5 01.05.2013 23:55
Как передать элемент jquery в конструктор объекта? nip jQuery 5 09.10.2012 13:08
Передать переменную в конструктор объекта {} hominini Общие вопросы Javascript 11 25.12.2011 08:34
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00