javascript - 是否有以下反射语言功能的名称和标准实现方式?

标签 javascript java c actionscript-3 syntax

假设您有一个对象,并且您想要获取您正在引用的属性名称的字符串。有这个名字吗?我的意思是它是某种反射,但是否有更具体的名称以及语言是否以标准方式实现它?

例如,此功能适用于在 JavaScript 或 ActionScript 中使用 toString() 的基于类的对象。

var person:Person = new Person();
var nameOfClass:String = person.toString();
trace(nameOfClass); // traces "Person" or "com.mydomain.model.Person"

但是由于属性可以为 null 或 undefined 你不能使用 toString() 因为它会抛出一个错误或者如果它不是 null 它会得到 :

var person:Person = new Person();
var nameOfProperty:String = person.name.toString(); // error is thrown when null
person.name = "John";
person.name.toString(); // traces the value "John" not the type

所以我猜有些语言会有这样的全局函数。

var person:Person = new Person();
var nameOfProperty:String = propertyName(person.name);

trace(nameOfProperty); // traces "name"

nameOfProperty = propertyName(person.zipCode);
trace(person.zipCode); // traces "zipCode" 

此功能是否有特定名称?如果有,如何实现?

最佳答案

这叫做 RTTI不,没有标准,也不可能有。

每种语言都以不同的方式实现类型(许多语言甚至不会在运行时保留它们)。在 C++ 中,类不知道它们的 namespace 。在 JS 中,原型(prototype)继承使整个事情变得毫无意义(尽管您可以获取构造函数,它有自己的名称)。

当访问实例中的属性时,它变得更加丑陋。该属性可能是一个 getter/setter 并链接到一个子对象或一个具有完全不同名称的字段。

很多语言确实在类级别提供运行时类型信息,但我不知道有一种语言具有足够多的属性,可以将它们自己反射(reflect)到类之外。每个属性都知道它在父级上的分配位置可能是不可能的,因为一个对象可能被分配给多个变量。查询会返回一系列未完成的引用,但创建该列表会引入更多引用(尽管很弱)。

在某些语言中,尤其是那些在常规旧代码而不是底层(虚拟)机器中实现垃圾收集的语言,您可能能够查找所有持有对象的智能指针。这通常是智能指针类的实现细节,因此它知道引用的数量或确切位置。

不过,这些功能都不会帮助您处理属性。我认为这主要是因为您可以将它们分配到任何地方,所以意义不大。如果您想要命名属性,请使用 Map。 ;)

关于javascript - 是否有以下反射语言功能的名称和标准实现方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39499198/

相关文章:

javascript - js中的字符串到日期转换器问题

java - 从带有 JAVA 查询参数的链接下载图像

检查n个数是否是完全平方数以及如何计算它们的和?

c - [+]、[-]、[i]...编码约定

javascript - 为什么 `document.getElementById(“#datepicker1” )` 找不到我的元素?

javascript - 如何使用javascript为html中的按钮添加消息框

java - 如何通过冲突的 maven-surefire-plugin 和 org.ow2.asm 在 Maven 中使用 JUnit 5 和 Java 10

c - 在 C 中删除另一个字符串中出现的字符串(代码和错误消息)

javascript - 使用 .jsx 扩展名测试 React 组件

java - Java中如何保存最后输入的字符串?