Javascript 下面的反射语言特性和实现的标准方式有名称吗?

Javascript 下面的反射语言特性和实现的标准方式有名称吗?,javascript,java,c,actionscript-3,syntax,Javascript,Java,C,Actionscript 3,Syntax,假设您有一个对象,并且希望获取所引用属性的名称字符串。那有名字吗?我的意思是,它是某种反射,但是否有更具体的名称,以及语言是否以标准方式实现它 例如,对于使用JavaScript或ActionScript中的toString()的基于类的对象,存在此功能 var person:Person = new Person(); var nameOfClass:String = person.toString(); trace(nameOfClass); // traces "Person" or "c

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

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

var person:Person = new Person();
var nameOfClass:String = person.toString();
trace(nameOfClass); // traces "Person" or "com.mydomain.model.Person"
但是,由于属性可以为null或未定义,因此不能使用
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" 
此功能是否有一个特定的名称,如果有,如何实现?

此功能被调用,没有,也没有标准

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

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

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

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

但是,这些功能都不能帮助您处理属性。我认为这主要是因为你可以把它们分配到任何地方,所以这不是很有意义。如果需要命名属性,请使用
映射
;)