SapUI5面向对象使用的继承方式与阮一峰老师在博客中介绍的”构造函数式的继承“的"利用空对象作为中介" 原理相同
首先上一张自己画的ui5的最底层的继承关系图
在sapui5中需要构造一个JS的“class", 需要从最底层的Metadata开始
找到resources/sap/ui/base/Metadata-dbg.js中的createClass方法:
Metadata.createClass = function (fnBaseClass, sClassName, oClassInfo, FNMetaImpl) {
... ...
if ( fnBaseClass ) {
... ...
// create prototype chain
fnClass.prototype = jQuery.sap.newObject(fnBaseClass.prototype);
fnClass.prototype.constructor = fnClass;
// enforce correct baseType
oClassInfo.metadata.baseType = fnBaseClass.getMetadata().getName();
}
... ...
}
当baseClass存在时,会将subClass的prototype设为baseClass的prototype
找到resources/jQuery.sap.global-debug.js
jQuery.sap.newObject = function newObject(oPrototype) {
return new (jQuery.sap.factory(oPrototype))();
};
jQuery.sap.factory = function factory(oPrototype) {
function Factory() {}
Factory.prototype = oPrototype;
return Factory;
};
这里的factory方法使用到了利用空对象作为中介,继承baseClass的prototype来构造一个新的subClass