在关闭高级编译中获取对象的属性名称?

时间:2013-08-09 14:42:07

标签: javascript google-closure-compiler

背景

我有一个对象数组,它们都是相同的类型。

我已经创建了一个类来处理所有相同类型的数组上的查找。该类的目的是防止迭代遍历数组,而不是每次基于它的属性查找对象时需要迭代。

我的查找类的骨架看起来像这样。所以你可以理解它的作用。

/**
 * @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”。

说明

我不是在寻找在对象类型的引号中使用属性的解决方案,因为在设计对象类时它需要先验知识,以后它将在某个未知组件中用作查找属性。

2 个答案:

答案 0 :(得分:2)

这是一个棘手的问题,并没有一个很好的解决方案。您可以查看一些讨论:Tests for Property Existance with Renaming

通常我会找到重构我的代码以不同方式处理问题的方法。

我鼓励您在Closure-compiler项目中打开一个问题,请求支持此功能。

答案 1 :(得分:2)

有许多解决方案:

两种阻止重命名的方法:

  • 始终如一地使用属性引用:

    item['id'] = 2;
    lookup.getByProperty('id', 2);
    
  • 添加一个extern声明:

    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];
    

这允许您指定与属性关联的类型,并与基于类型的优化配合良好。