为何"instanceof Mixin(Class)"判断不生效?求原生JS解决方案
问题分析与解决办法
为什么代码输出false?
每次调用Foo(Bar)时,都会创建一个全新的匿名类。FooBar继承的是第一次调用Foo(Bar)生成的类,而console.log里的Foo(Bar)是第二次调用生成的另一个完全独立的类。instanceof的判断逻辑是检查对象的原型链上是否存在目标构造函数的prototype属性,这两个类的prototype完全不同,所以结果自然是false。
原生JavaScript解决办法
给Foo添加缓存机制,让同一个classToExtend传入时返回同一个类,避免重复创建:
class Bar {} const Foo = (() => { // 用Map缓存已生成的类 const classCache = new Map(); return (classToExtend) => { if (classCache.has(classToExtend)) { return classCache.get(classToExtend); } const ExtendedClass = class extends classToExtend {}; classCache.set(classToExtend, ExtendedClass); return ExtendedClass; }; })(); class FooBar extends Foo(Bar) {} let fb = new FooBar; // 现在输出true console.log(fb instanceof Foo(Bar));
这个方案利用闭包保存缓存,确保相同的基类传入时,Foo始终返回同一个扩展类,这样两次Foo(Bar)指向的是同一个构造函数,instanceof就能正确返回true。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

