首页 > 其他分享 >关于 SAP UI5 框架代码中的 Metadata.createClass

关于 SAP UI5 框架代码中的 Metadata.createClass

时间:2023-08-14 16:00:11浏览次数:28  
标签:SAP Metadata FNMetaImpl fnBaseClass fnClass UI5 constructor oClassInfo createCla

这段代码定义了一个名为 Metadata.createClass 的函数,用于在 SAPUI5 框架中创建类并添加元数据信息。我将逐行解释这段代码的含义和作用。

/**
 * @since 1.3.1
 * @private
 */
Metadata.createClass = function (fnBaseClass, sClassName, oClassInfo, FNMetaImpl) {

这是一个注释块,说明了函数的历史版本和私有性质。Metadata.createClass 函数被定义,它接收四个参数:fnBaseClasssClassNameoClassInfo,和 FNMetaImpl

if ( typeof fnBaseClass === "string" ) {
	FNMetaImpl = oClassInfo;
	oClassInfo = sClassName;
	sClassName = fnBaseClass;
	fnBaseClass = null;
}

这个条件块检查 fnBaseClass 参数是否是字符串。如果是,它会重新排列变量,以处理函数参数的不同组合方式。

assert(!fnBaseClass || typeof fnBaseClass === "function");
assert(typeof sClassName === "string" && !!sClassName);
assert(!oClassInfo || typeof oClassInfo === "object");
assert(!FNMetaImpl || typeof FNMetaImpl === "function");

这几行使用断言来验证输入参数的类型是否符合预期条件。assert 函数用于检查提供的条件是否为 true,如果不是,就会抛出错误。

FNMetaImpl = FNMetaImpl || Metadata;
if ( typeof FNMetaImpl.preprocessClassInfo === "function" ) {
	oClassInfo = FNMetaImpl.preprocessClassInfo(oClassInfo);
}

这部分代码将 FNMetaImpl 设置为 Metadata,如果它未提供。然后,它检查 FNMetaImpl 是否具有 preprocessClassInfo 函数。如果存在,它会将该函数应用于 oClassInfo。这是一种在创建类之前预处理类信息的机制。

oClassInfo = oClassInfo || {};
oClassInfo.metadata = oClassInfo.metadata || {};
if ( !oClassInfo.hasOwnProperty('constructor') ) {
	oClassInfo.constructor = undefined;
}

这里确保 oClassInfooClassInfo.metadata 被初始化为对象,如果未提供的话。还检查 oClassInfo 是否具有 'constructor' 属性。如果没有,将 oClassInfo.constructor 设置为 undefined

var fnClass = oClassInfo.constructor;
assert(!fnClass || typeof fnClass === "function");

这将 oClassInfo.constructor 赋值给 fnClass。然后,它使用断言来确保 fnClass 要么为 null(或 undefined),要么为函数。

if ( fnBaseClass ) {
	// ...
} else {
	// ...
}

这个条件块检查是否存在 fnBaseClass。如果存在,说明创建的类具有基类。if 块处理有基类的情况,而 else 块处理没有基类的情况。

fnClass.prototype = Object.create(fnBaseClass.prototype);
fnClass.prototype.constructor = fnClass;
oClassInfo.metadata.baseType = fnBaseClass.getMetadata().getName();

如果有基类,这一部分将 fnClass 的原型设置为一个基于 fnBaseClass.prototype 的实例。它还更新了 fnClass.prototype 的构造函数。此外,它将元数据中的 baseType 属性设置为来自 fnBaseClass.getMetadata().getName() 的基类名称。

} else {
	// default constructor does nothing
	fnClass = fnClass || function() { };
	// enforce correct baseType
	delete oClassInfo.metadata.baseType;
}
oClassInfo.constructor = fnClass;

如果没有基类,这部分代码设置了一个默认构造函数 fnClass,如果它尚未定义的话,会赋值为空函数。此外,它删除了元数据中的 baseType 属性,以确保一致性。最后,将 fnClass 赋值给 oClassInfo.constructor

ObjectPath.set(sClassName, fnClass);

此行使用 ObjectPath 将类名 sClassName 作为全局对象的属性,属性值为 fnClass 函数。这实际上将该类在全局范围内可见。

var oMetadata = new FNMetaImpl(sClassName, oClassInfo);
fnClass.getMetadata = fnClass.prototype.getMetadata = function() {
	return oMetadata;
};

创建一个 FNMetaImpl 类的实例,提供类名和类信息作为参数。然后,将 getMetadata 方法分配给类和其原型,该方法返回 `oMetadata

` 实例。

if ( !fnClass.getMetadata().isFinal() ) {
	fnClass.extend = function(sSCName, oSCClassInfo, fnSCMetaImpl) {
		return Metadata.createClass(fnClass, sSCName, oSCClassInfo, fnSCMetaImpl || FNMetaImpl);
	};
}

这部分代码为 fnClass 添加一个 extend 方法,前提是类不被标记为 finalextend 方法用于创建一个扩展当前类的新类。它接受新子类的名称、类信息和可选的元数据实现。它调用 Metadata.createClass 来创建新的子类。

return fnClass;

最后,createClass 函数返回创建的类。

总之,Metadata.createClass 定义了一个功能强大的实用程序,用于在 SAPUI5 框架中创建类并添加元数据信息。它为具有基类和没有基类的情况提供了灵活性,并确保适当的继承和元数据管理。这个实用程序提升了在 SAPUI5 应用中 JavaScript 代码的组织性和可维护性。

标签:SAP,Metadata,FNMetaImpl,fnBaseClass,fnClass,UI5,constructor,oClassInfo,createCla
From: https://www.cnblogs.com/sap-jerry/p/17628895.html

相关文章

  • SAP Fiori Elements 应用里标准模板 XML Fragment 加载的逻辑和 XMLPreprocessor 的作
    触发时间点是XMLPreprocessor的insertFragment方法:上图的调试器上下文里,我们看到了XMLPreprocessor.js的实现,它是SAPUI5框架中一个重要的文件,它主要负责处理XML视图的预处理工作。对于SAPUI5中的视图创建,可以使用JavaScript、JSON、XML等多种方式。其中,XML......
  • 问题解答:关于 SAP UI5 控制器(Controller) JavaScript 编码里单引号和双引号的用法澄
    笔者这篇教程文末,有朋友提问:SAPUI5应用开发教程之十-什么是SAPUI5应用的描述符文件manifest.json问题1:在index.html文件中body标签添加了代码:<divdata-sap-ui-componentdata-name="sap.ui5.walkthrough"data-id="container"data-settings='{"id":"wa......
  • SAP UI5 XML 视图里解析 Extension Point 的触发点
    解析到XML视图里的ExtensionPoint定义后,开始实例化过程:Extensionpoint的工作原理是在原有的应用中预定义一些扩展点,然后开发者可以在这些扩展点插入自定义的组件或代码,以实现新的功能。这种机制的优点是可以保持原有应用的稳定性,同时也方便进行扩展和维护。具体来说,SAPU......
  • SAP UI5 框架 Manifest.js 里 getObject 函数的实现解析
    我们在SAPUI5manifest.json文件里定义的配置信息,通过下图Manifest.js文件里的getObject函数返回给消费者。这是一个名为getObject的JavaScript函数,主要用于通过给定的路径访问对象的子成员。下面是这段代码的中文注释:/***通过给定路径访问一个对象的子成员的实......
  • SAP UI5 manifest.json 里定义的 sap.ui.viewExtensions 区域的解析代码位置
    笔者这篇教程介绍了如何在SAPFioriElements应用的manifest.json里注册Extensionfragment,从而给ListReport应用的Table区域新增自定义列:10.如何通过扩展(Extension)的方式给SAPFioriElementsListReport的表格新增列上图extends区域注册的Extension信......
  • 关于 SAP Fiori Elements 应用的 ResponsiveTableColumnsExtension 扩展
    笔者这篇教程介绍了如何在SAPFioriElements应用的manifest.json里注册Extensionfragment,从而给ListReport应用的Table区域新增自定义列:10.如何通过扩展(Extension)的方式给SAPFioriElementsListReport的表格新增列请大家注意下图高亮的扩展:ResponsiveTabl......
  • SAP UI5 manifest.json 文件里 extends 区域的内容是如何被解析的
    笔者这篇教程介绍了如何在SAPFioriElements应用的manifest.json里注册Extensionfragment,从而给ListReport应用的Table区域新增自定义列:10.如何通过扩展(Extension)的方式给SAPFioriElementsListReport的表格新增列我浏览器打开了SAPFioriElements应......
  • SAP CDS view 里 UNION 操作的用法
    下图是SAPCDSviewUnion操作的语法和例子:SAPCDS(CoreDataServices)视图是SAPHANA数据库在ABAP层面上的抽象和逻辑视图。它不仅提供了一种SQL类型的语言(DataControlLanguage,DCL)来查询和操作数据,还提供了各种特性和功能以支持应用程序开发。在SAPCDS中,Union操......
  • SAP CDS view 的 having Condition 用法
    Havingcondition在groupby执行完毕后才evaludateSAPCDS(CoreDataServices)是一个用于定义和消费数据模型的基础设施。CDS提供了一种新的数据建模方式,它能够在数据库层定义复杂的视图,以提供更高效的数据访问。HAVING关键字在SQL中常常与GROUPBY关键字一起使用......
  • ABAP 开发者上云的时候到了 - 现在大家可以免费使用 SAP 云平台 ABAP 环境的试用版了
    之前Jerry已经写了一系列SAPCloudPlatformABAP编程环境的文章,当时使用的环境,是SAP专门为SAP社区导师们创建的。当时也有朋友留言,询问大家何时才能使用到免费的SAP云平台ABAP编程环境。SAP社区上也有世界各地的开发者问这个问题,负责这个话题的同事们的答复大意是:我们一直在努......