PrimeFaces widget如何实现类似Java instanceof的继承关系判断
PrimeFaces Widget继承关系判断方案
测试用继承层级如下:
WidgetA | WidgetB | WidgetC
1. 实例类型校验(等价Java instanceof效果)
PrimeFaces的Widget体系基于jQuery UI Widget工厂实现,不要用JavaScript原生的instanceof关键字做判断——原生语法无法识别PrimeFaces自定义继承链上的父类类型,必须调用Widget实例自带的instanceof()方法,该方法会自动沿继承链向上匹配,效果和Java的instanceof完全一致。
示例代码(假设widgetC是WidgetC的实例):
// 匹配自身类型,返回true widgetC.instanceof(PrimeFaces.widget.WidgetC) // 匹配直接父类WidgetB,返回true widgetC.instanceof(PrimeFaces.widget.WidgetB) // 匹配顶层父类WidgetA,返回true widgetC.instanceof(PrimeFaces.widget.WidgetA) // 匹配无关类型,返回false widgetC.instanceof(PrimeFaces.widget.Dialog)
2. Widget类型间的子父类关系判定
如果不需要实例,直接判断两个Widget构造函数的继承关系,可以通过遍历子类型原型链上的superclass属性实现,效果等价于Java的Class.isAssignableFrom()。
通用判断方法如下:
/** * 判断childWidget是否是parentWidget的子类型(含直接继承、间接继承) * @param {Function} childWidget 子Widget构造函数 * @param {Function} parentWidget 父Widget构造函数 * @returns {boolean} */ function isChildType(childWidget, parentWidget) { let currentPrototype = childWidget.prototype; while (currentPrototype) { if (currentPrototype === parentWidget.prototype) { return true; } currentPrototype = currentPrototype.superclass; } return false; }
使用示例:
// WidgetC继承自WidgetB,返回true isChildType(PrimeFaces.widget.WidgetC, PrimeFaces.widget.WidgetB) // WidgetC间接继承自WidgetA,返回true isChildType(PrimeFaces.widget.WidgetC, PrimeFaces.widget.WidgetA) // WidgetA是WidgetC的父类,反向判断返回false isChildType(PrimeFaces.widget.WidgetA, PrimeFaces.widget.WidgetC) // 无继承关系返回false isChildType(PrimeFaces.widget.WidgetB, PrimeFaces.widget.Dialog)
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

