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

Get property name of object in closure advanced compiling?

本文关键字:属性 取对象 获取 闭包 高级 编译      更新时间:2023-09-26

背景

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

我创建了一个类,用于处理所有相同类型的数组上的查找。该类的目的是防止在每次基于对象的属性查找对象时,对数组进行超出所需的迭代。

我的查找类的基本内容如下所示。所以你可以理解它的作用。

/**
 * @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编译器项目中打开一个问题,请求提供支持此功能的功能。