Есть ли какой-либо способ перехватить и изменить статический метод встроенного класса?

#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);