Показать сообщение отдельно
  #2 (permalink)  
Старый 21.05.2019, 11:44
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,708

Вариант №1
class Person {
	constructor(firstName, lastName, age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;

		Object.freeze(this);
	}

	set firstName(value) {
		if(value instanceof String === false && typeof value !== "string")
			throw new TypeError(`No instance for ‘${Object(value).constructor.name}’ arising from a use of ‘firstName’`);

		if(value.length < 3 || value.length > 20)
			throw new RangeError(`Invalid first name length`);

		if(!/^[a-zçéäëïöü'’‘–—-]{3,20}$/i.test(value))
			throw new Error(`Invalid first name`);

		this._firstName = value;
	}

	get firstName() {
		return this._firstName;
	}

	set lastName(value) {
		if(value instanceof String === false && typeof value !== "string")
			throw new TypeError(`No instance for ‘${Object(value).constructor.name}’ arising from a use of ‘lastName’`);

		if(value.length < 3 || value.length > 20)
			throw new RangeError(`Invalid last name length`);

		if(!/^[a-zçéäëïöü'’‘–—-]{3,20}$/i.test(value))
			throw new Error(`Invalid last name`);

		this._lastName = value;
	}

	get lastName() {
		return this._lastName;
	}

	set age(value) {
		if(value instanceof Number === false && typeof value !== "number")
			throw new TypeError(`No instance for ‘${Object(value).constructor.name}’ arising from a use of ‘age’`);

		if(value < 0 || value > 150)
			throw new RangeError(`Invalid age`);

		this._age = value;
	}

	get age() {
		return this._age;
	}
}


Вариант №2
class Person {
	constructor(firstName, lastName, age) {
		function validateName(type, name) {
			if(name instanceof String === false && typeof name !== "string")
				throw new TypeError(`No instance for ‘${Object(name).constructor.name}’ arising from a use of ‘${type}’`);

			if(name.length < 3 || name.length > 20)
				throw new RangeError(`Invalid length of ‘${type}’`);

			if(!/^[a-zçéäëïöü'’‘–—-]{3,20}$/i.test(name))
				throw new Error(`Invalid name of ‘${type}’`);
		}

		// names validation
		validateName("firstName", firstName);
		validateName("lastName", lastName);

		// age validation
		if(age instanceof Number === false && typeof age !== "number")
			throw new TypeError(`No instance for ‘${Object(age).constructor.name}’ arising from a use of ‘age’`);

		if(age < 0 || age > 150)
			throw new RangeError(`Invalid age`);

		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;

		Object.freeze(this);
	}
}


UPD Если вы хотите использовать синтаксис функции для объявления класса, то не забудьте проверить, чтобы this был инициализирован соответствующим образом! Поскольку если вы вызовете Person как функцию, то this указывает на глобальный объект/на другой this, если вызов в контексте и т. д. Вариант №3, похожий на ваш
function Person(firstName, lastName, age) {
	if(!new.target)
		throw new TypeError("Constructor ‘Person’ requires ‘new’");

	// проверки аргументов, например, как в примерах выше

	this.firstName = firstName;
	this.lastName = lastName;
	this.age = age;
	
	Object.freeze(this);
}

Последний раз редактировалось Malleys, 21.05.2019 в 12:11.
Ответить с цитированием