下面的反射语言特性和标准实现方式是否有名称?
Is there a name for the following reflection language feature and standard way to implement?
假设你有一个对象,你想要获得你所引用的属性名称的字符串。那有什么名字吗?我的意思是它是某种reflection
但是它有一个更具体的名字吗?语言是否以标准的方式实现它?
例如,在JavaScript或ActionScript中使用toString()
的基于类的对象存在此特性。
var person:Person = new Person();
var nameOfClass:String = person.toString();
trace(nameOfClass); // traces "Person" or "com.mydomain.model.Person"
但是由于属性可以是空的或未定义的,你不能使用toString()
,因为它会抛出一个错误,或者如果它不是null
,它会得到value
:
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++中,类并不知道它们的名称空间。在JS中,原型继承使整个事情变得毫无意义(尽管你可以获取构造函数,它有自己的名字)。
当访问实例中的属性时,它变得更加难看。属性可以是getter/setter,并链接到子对象或具有完全不同名称的字段。
许多语言确实在类级别提供运行时类型信息,但我不知道有一种语言具有足够重的属性,它们可以在类之外反映自己。每个属性知道它在父对象上的分配位置可能是不可能的,因为一个对象可能被分配给多个变量。查询将返回一个未完成的引用数组,但创建该列表将引入更多引用(尽管是弱引用)。
在某些语言中,特别是在常规旧代码而不是底层(虚拟)机中实现垃圾收集的语言中,可能能够查找保存对象的所有智能指针。这通常是智能指针类的实现细节,因此它知道引用的数量或确切位置。
但是,这些特性都不能帮助您处理属性。我想这主要是因为你可以把它们分配到任何地方,所以这不是很有意义。如果需要命名属性,请使用Map
。div;) 相关文章:
- 如何使用动画实现纸张推车
- 客户端服务器REST API captcha实现
- 如何实现此布局
- Meteor忘记了密码的实现
- 使用Native Sockets在Android中实现WebSockets
- 在样板文件中实现Ajax
- instanceof是如何在JavaScript中实现的
- 如何正确实现Jquery多选小部件
- 实现一个建立在google.com之上的自定义搜索引擎
- 多个组件是如何实现的
- window.location使用jquery mobile实现chrome跳转
- 如何在OpenERP中实现网络摄像头
- 在哪里可以学习ECMAScript标准中尚未包含的JavaScript功能
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- javascript加密实现,包括可信否认
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 如何让程序员在javascript中实现正确的回调
- 下面的反射语言特性和标准实现方式是否有名称?
- 哪些ECMAScript 6/7标准是在Firefox中实现的,而不是在chrome中
- 在实现聊天服务时应该遵循哪些最佳实践和标准