Начиная с классов ES6, можно расширять специальные объекты, такие как функции, массивы и оболочки примитивов. Все просто: просто напишите класс, который расширяет соответствующий тип, и используйте его:
class MyNumber extends Number {
constructor() {
super(42)
}
square() {
return this ** 2
}
}
var x = new MyNumber()
console.log(typeof x, x + "", x.square() + "")
Но у EcmaScript также есть некоторые новые типы, такие как Symbol
и BigInt
. Они по-прежнему имеют непримитивные типы-обертки, но вы не можете использовать их как конструктор, и вам нужно явно обернуть примитив в объект:
var x = BigInt("42")
var y = Object(x)
console.log(typeof x, x + "", x + 1n + "")
console.log(typeof y, y + "", y + 1n + "")
try {
var z = new BigInt("42")
} catch (e) {
console.log(e.message)
}
Что если я захочу расширить такую обертку? Определение класса работает хорошо, но если я пытаюсь создать объект, он вызывает super
call:
class MyBigInt1 extends BigInt {
constructor() {
super("42")
}
}
try {
var x = new MyBigInt1()
} catch (e) {
console.log(e.message)
}
class MyBigInt2 extends BigInt {
constructor() {
}
}
try {
var x = new MyBigInt2()
} catch (e) {
console.log(e.message)
}