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

Сообщение от Alexandroppolus
На случай, если прилетит объектная обертка, для которой typeof будет 'object'
На самом деле на случай, когда будет передана примитивная строка.

На самом же деле можно всё проще сделать: например, возраст можно рассматривать как тип Age, который является подмножеством Number. Тоже самое с именем, тип Name является подмножеством типа String. Т. е. не каждое число является возрастом, но любой возраст является числом!

Вот, наверное, самый лучший вариант...
class Age extends Number {
	constructor(age) {
		super(age);

		if(super.constructor.isNaN(this) || this < 0 || this > 150)
			throw new TypeError("Invalid age");
	}
}

class Name extends String {
	constructor(name) {
		super(name);

		if(this.length < 3 || this.length > 20 || !/^[a-zçéäëïöü'’‘–—-]{3,20}$/i.test(this))
			throw new TypeError("Invalid name");
	}
}

class Person {
	constructor(firstName, lastName, age) {
		this.firstName = new Name(firstName);
		this.lastName  = new Name(lastName);
		this.age       = new Age(age);

		Object.freeze(this);
	}
}


Сообщение от Alexandroppolus
Пока что [new.target] мало поддерживается браузерами.
на самом деле поддерживается очень хорошо!

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