通过为类定义 [symbol.hasinstance] 静态方法,可以完全自定义 instanceof 运算符的判断逻辑。该方法的返回值必须是一个布尔值,它决定了当使用 obj instanceof class 时是否返回 true。

如何修改默认的原型链检查行为?
直接实现 [Symbol.hasInstance] 即可覆盖默认的 [[Prototype]] 检查。例如,让一个类始终判定所有对象为其实例,或者根据对象的特定属性进行判断。

class CustomClass {
static [Symbol.hasInstance](instance) {
// 自定义逻辑:如果对象有 'custom' 属性,则视为实例
return instance && 'custom' in instance;
}
}
const obj = { custom: true };
console.log(obj instanceof CustomClass); // true
const normalObj = {};
console.log(normalObj instanceof CustomClass); // false
如何实现基于数据类型的动态实例检查?
在需要处理多种数据结构或模拟多态时,可以根据传入对象的类型特征动态决定 instanceof 的结果。这允许我们在不改变原型链的情况下,灵活地扩展类的“身份”识别范围。
掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java

class Shape {
static [Symbol.hasInstance](instance) {
if (typeof instance !== 'object') return false;
// 检查是否是圆形(有 radius 属性)
if ('radius' in instance) return true;
// 检查是否是矩形(有 width 和 height 属性)
if ('width' in instance && 'height' in instance) return true;
return false;
}
}
const circle = { radius: 5 };
const rect = { width: 10, height: 20 };
const square = { side: 10 };
console.log(circle instanceof Shape); // true
console.log(rect instanceof Shape); // true
console.log(square instanceof Shape); // false
当 Symbol.hasInstance 抛出异常时会发生什么?
如果在 [Symbol.hasInstance] 的实现中抛出了错误,instanceof 操作符会将该异常向上传播,导致程序中断。因此,在实现该方法时必须确保其内部逻辑是健壮的,能够处理各种输入情况而不产生副作用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










