#ecmascript-6
Вопрос:
С instanceof
помощью , мы можем сделать это:
new Number(1) instanceof Number // true
Но мы не можем этого сделать:
1 instanceof Number // false
Поскольку ES6 предоставляет [Symbol.hasInstance]
для нас, мы можем использовать его для создания нового класса, чтобы instanceof
можно было проверить значение примитива. Например:
class MyNumber {
static [Symbol.hasInstance](x){
return typeof(x) === 'object'? x instanceof Number:typeof(x) === 'number'
}
}
const a = 1
const b = new Number(1)
a instanceof MyNumber // true
b instanceof MyNumber // true
Однако можем ли мы просто перехватить и изменить статический метод встроенного класса ( Number[Symbol.hasInsatnce]
в данном случае) вместо создания другого нового класса ( MyNumber
в данном случае)?
Ответ №1:
Классы на самом деле являются функциями. Так Object.defineProperty
что дальше Number
будем это делать.
Object.defineProperty(Number, Symbol.hasInstance, {
value: function(x) {
return typeof(x) === 'object' ? x instanceof Number : typeof(x) === 'number'
}
});
console.log(1 instanceof Number);