有没有办法拦截和修改内置类的静态方法?



使用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(?

类实际上是函数。所以Number上的Object.defineProperty会这么做。

Object.defineProperty(Number, Symbol.hasInstance, {
value: function(x) {
return typeof(x) === 'object' ? x instanceof Number : typeof(x) === 'number'
}
});
console.log(1 instanceof Number);

相关内容

最新更新