在闭包高级编译中获取对象的属性名称
Get property name of object in closure advanced compiling?
背景
我有一个对象数组,它们都是相同的类型。
我创建了一个类,用于处理所有相同类型的数组上的查找。该类的目的是防止在每次基于对象的属性查找对象时,对数组进行超出所需的迭代。
我的查找类的基本内容如下所示。所以你可以理解它的作用。
/**
* @constructor
* @param {Array} items An array of all the same type of item.
*/
titan.structs.IndexedLookup = function (items) {};
/**
* Get by property
* @param {String} property The property name.
* @param {String|Number} value The property value.
* @returns {Object|null}
*/
titan.structs.IndexedLookup.prototype.getByProperty =
function (property, value) {};
问题
我想使用这个的最后一行
var lookup = new titan.structs.IndexedLookup(myArrayOfItems);
// Lookup by property 'id'
var item = lookup.getByProperty("id", 27);
我想不出任何聪明的方法来获得高级编译器指定的实际属性名称,而不是"id"。
备注
我不是在寻找在对象类型上使用引号中的属性的解决方案,因为这需要在设计对象类时有先验知识,以便稍后在某些未知组件中用作查找属性。
有许多解决方案:
防止重命名的两种方法:
-
一致使用属性报价:
item['id'] = 2; lookup.getByProperty('id', 2);
-
添加外部声明:
Object.prototype.id;
允许重命名的两种方法:
-
添加JSCompiler_renameProperty的声明,如:
function JSCompiler_renameProperty(prop) { return prop }
并像这样使用:
lookup.getByProperty(JSCompiler_renameProperty("id"), 27);
这是不好的。它与基于类型的优化配合得很好。
使用闭包库中的goog.reflect.object:
var idPropName = (goog.object.transpose(goog.reflect.object(MyType, id: 1)))[1];
这允许您指定与属性关联的类型,并且可以很好地与基于类型的优化配合使用。
这是一个难题,目前还没有一个好的解决方案。您可以查看一些讨论:重命名的属性存在性测试
通常情况下,我会找到重构代码的方法,以不同的方式处理问题。
我鼓励您在Closure编译器项目中打开一个问题,请求提供支持此功能的功能。
相关文章:
- 序列化数据属性中对象的最可靠方法
- 识别没有ID或特定属性的对象
- JavaScript-用唯一属性标识对象
- JavaScript-通过类似的属性查找对象,并将其推送到一个新的数组中
- 如何创建共享某些属性的对象
- 如何指定在执行控制台时要显示的属性.log对象
- 如何按天、周、月对具有时间戳属性的对象进行分组
- 数.[属性] 是对象或构造函数的属性
- 如何使用第二个数组中对象的相关属性对对象数组进行排序
- 按属性对对象数组进行排序
- Javascript:如何制作一个包含4个具有相同属性的对象的数组
- 基于公共属性合并对象数组
- 未捕获的类型错误:属性'$'对象[object Window]的
- 从函数属性访问对象属性;不适用于Firefox
- find()方法返回具有不需要的属性的对象
- 在 Javascript 中创建具有自己属性的对象数组
- 如果我可以随时将任何属性插入对象,那么在javascript中创建类有什么用
- 通过对具有相同属性的对象进行分组,将数组减少为 A
- 从新对象的属性更新对象的属性,但前提是新对象上的属性不是未定义的
- 访问未命名对象的属性(在对象内)