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

Javascript 在闭包高级编译中获取对象的属性名称?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,背景 我有一个类型相同的对象数组 我创建了一个类来处理对所有相同类型数组的查找。该类的目的是防止每次根据对象的属性查找对象时对数组的迭代次数超过所需次数 我的lookup类的基本结构如下所示。所以你可以理解它的作用 /** * @constructor * @param {Array} items An array of all the same type of item. */ titan.structs.IndexedLookup = function (items) {}; /**

背景

我有一个类型相同的对象数组

我创建了一个类来处理对所有相同类型数组的查找。该类的目的是防止每次根据对象的属性查找对象时对数组的迭代次数超过所需次数

我的lookup类的基本结构如下所示。所以你可以理解它的作用

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

备注


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

这是一个很难解决的问题,目前还没有很好的解决方案。您可以查看一些讨论:

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


我鼓励您在闭包编译器项目中打开一个问题,请求一个支持此功能的功能。

这是一个困难的问题,没有很好的解决方案。您可以查看一些讨论:

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


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

有许多解决方案:

防止重命名的两种方法:

  • 一致使用属性引用:

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

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

有许多解决方案:

防止重命名的两种方法:

  • 一致使用属性引用:

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

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

感谢您的回复,我已将我的用例添加到该问题的评论中。感谢您的回复,我已经在这个问题的评论中添加了我的用例。阻止重命名对我来说并不是一个理想的解决方案,因为它意味着当我知道其他类将使用什么属性(对于不同的类可能不同)时,返回并编辑我的对象类型。我喜欢使用
JSCompiler\u renameProperty
的外观,一旦我能尝试一下,就会给你回复。而
goog.reflect.object
对我来说是新的,我用高级编译以不同的方式处理对象类型,所以这将非常有用。干杯。如果使用基于类型的优化,则不需要重命名使用相同属性名的不相关类中的使用。但是,您将需要对象以外的主机类型@接口声明对此很有效(然后将类声明为实现此外部接口)。这种消除歧义的方法依赖于足够的、可区分的类型信息,因此不能保证。防止重命名对我来说并不是一个理想的解决方案,因为它意味着当我知道其他类将使用什么属性时(对于不同的类可能不同),就返回并编辑我的对象类型。我喜欢使用
JSCompiler\u renameProperty
的外观,一旦我能尝试一下,就会给你回复。而
goog.reflect.object
对我来说是新的,我用高级编译以不同的方式处理对象类型,所以这将非常有用。干杯。如果使用基于类型的优化,则不需要重命名使用相同属性名的不相关类中的使用。但是,您将需要对象以外的主机类型@接口声明对此很有效(然后将类声明为实现此外部接口)。这种消歧依赖于充分的、可区分的类型信息,因此不能保证。