使用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);