【问题标题】:Read Java Script function argument data type infomation读取 Javascript 函数参数数据类型信息
【发布时间】:2016-12-28 22:19:24
【问题描述】:

是否可以读取 java 脚本函数参数及其类型信息?

例如,我有一个类如下:

    sap.ui.define( ['sap/ui/core/theming/Parameters'],
            function(P){
                'use strict';
            var B=C.extend('sap.m.Button', { 
                            metadata:{
                                properties:{
                                text:{
                                    type:'string',
                                    group:'Misc',
                                    defaultValue:null
                                },
                                type:{
                                    type:'sap.m.ButtonType',
                                    group:'Appearance',
                                    defaultValue:sap.m.ButtonType.Default
                                }
                            }
                        } );

.....B.prototype.setType=function(t){this.setProperty('type',t);....

......lot of code exposes public setter & getter methods for the above properties.......
                        } );

类的完整代码可以从here获取。

我能够从类公开的公共方法中读取方法名称。但这不允许我知道参数及其类型信息。

例如:B.prototype.setType 是一个公开的方法。我可以获取 Button 类的对象,但不知道如何在运行时读取其参数类型信息。

如果我想让用户为“type”属性添加值(它是按钮类型),我应该知道他可以输入的值的类型。

我怎样才能做到这一点?

谢谢

编辑 1:

在我的第一步中,我使用框架公开的 sap.m.Button 类的getMetadata() 方法,这给了我 publicMethodNames 但它没有给我关于参数类型信息的信息。所以,我正在寻找替代品。

在java中,针对这种需求,我们有反射API。我们如何在 javascript 中实现相同的功能?

编辑 2: 说明在 IDE 中实现的结果的屏幕截图。

【问题讨论】:

  • 给出的代码不足以理解你想要什么。显然,您可以在函数调用中检查参数的类型,但在实际调用函数(方法)之前,参数只是一个名称占位符,因为 JS 不是类型化语言。
  • Dellirium,感谢您的评论。添加了实际类的参考链接。
  • 没有暴露类型信息的反射API,因为语言中没有任何类型信息。您能做的最好的事情就是在其他地方获取该信息。例如,如果您知道 Button 的 setType 期望参数具有来自某个列表的值,您可能能够发现该列表在框架代码中的定义位置。
  • @artem:如果我知道一个方法在其参数中的期望,我应该能够创建相应的对象。但我的挑战是找到一个方法(例如 setType)接受什么。类似的事情在 Web IDE 中完成,但目的不同。我添加了截图。
  • 哦。看起来该框架已记录在案:openui5.hana.ondemand.com/#docs/api/symbols/…,并且此类文档通常是从某个来源生成的。如果是这样,您可以尝试了解文档生成器(或那个 IDE)的工作原理以及它从哪里获取这些信息。

标签: javascript metadata metaprogramming sapui5


【解决方案1】:

您可以通过arguments对象访问函数参数:

var f = function () {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i], typeof arguments[i]);  
  }
}

f(123, 'test', { a: 1}, function () { alert('x') });

UPD如何获取声明的参数编号:

var f = function (a, b) {
  console.log(arguments); 
};

console.log(f.length); //2
f(1, 1, 1, 1); //object with 4 keys
f(1); //object with 1 key

【讨论】:

  • Digger2000:感谢您的回复。我无法理解你的建议。类的功能来自框架。我无法修改函数以记录“参数”信息。我如何从函数和类外部访问函数参数类型信息是我的问题。在 java 中,我可以使用反射 API 查看类和方法及其参数。 javascript中是否可能发生类似的事情?谢谢
  • JavaScript 中的函数没有固定的参数列表,它们可以用任何参数调用。但是,您可以访问声明的参数编号: var f = function (a, b) { /* code */};控制台.log(f.length); //2
  • 很好。我也需要参数和它们的类型,以便让用户输入有效信息。
  • 我认为您的问题更多地与框架有关,而不是与 JavaScript 本身有关。
  • 框架在这里没有多大帮助。这就是为什么我想看看我是否可以从语言能力中获得解决方案!您还能想到其他解决方案吗?
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 2011-10-04
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多