2015-06-19 78 views
4

我试图让一个Object谁,当我搜索属性,执行该财产的“查找”不区分大小写。对象原型:不区分大小写消气上的所有属性

var x = new CaseInsensitiveObject(); 

x.firstProperty = "Hello!"; 

alert(x.firstproperty); //alerts Hello! 

我一直在使用Object.defineProperty()这种尝试,但它需要字符串文字的属性作为参数Object.defineProperties()将有同样的问题,如果你认为这件事)

有没有办法,我可以通用集getter为对象的所有对象属性,而不提供关键的名字吗?即:

Object.defineAllProperties(obj, { 
    get: function(prop) 
    { 
     if(!prop.toLowerCase && prop.toString) 
      prop = prop.toString(); 
     if(prop.toLowerCase) 
      prop = prop.toLowerCase(); 
     return this[prop]; 
    } 
}); 

如果不是所有的属性,我怎么能设置一个Object连一个属性是不区分大小写?

注:

据我了解,扩大Object.prototype通常是一个坏事情,但我有我的理由。由于某些数据库更改,我需要快速修复。最终修复需要几天的时间,我需要运行软件才能进行QA测试。这个原型方法将使所有的工作都能够在我做出所有必要的改变的同时,这种方法不会被放入任何生产环境中。所以,如果你打算开枪打我,甚至想着这样做,我就不听。

谢谢大家!

+0

我!已经检查了许多与我的答案类似的其他帖子呃,但真的不碰就可以了,像这样的(这这不是重复!!!):不区分大小写映射(http://stackoverflow.com/questions/17556948/case-insensitive-property-mapping ),[为所有对象属性设置原型](http://stackoverflow.com/questions/26662202/set-prototype-for-all-object-properties),还有更多 – WebWanderer

+3

你可以写一大堆setter/getters每个属性名称的大写字母排列。或者,您可以在支持他们的环境中使用['Proxy'对象(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)。 – apsillers

+0

哈哈,我认为为一个关键的所有渗透做一个吸气和二传手会有点紧张。虽然@apsillers好射击。 '代理'将工作,但不幸的是,其ECMA6。无法使用它。 – WebWanderer

回答

0

所以,以下@apsillers评论后,我做了解决我的问题(我只需要为小写和驼峰支持,这是不是我会考虑理想和实际不回答我的制作情况的问题不敏感的对象属性,但我应该分享:

function makeCaseInsensitiveObject(obj) 
{ 
    var keys; 

    function PropertyScope(iObj, key, val) 
    { 
     var value = val; 

     var _get = function() 
     { 
      return value; 
     }; 

     var _set = function(v) 
     { 
      value = v; 
     }; 

     Object.defineProperty(iObj, key, { 
      get: _get, 
      set: _set 
     }); 

     Object.defineProperty(iObj, key.toLowerCase(), { 
      get: _get, 
      set: _set 
     }); 
    }; 

    if(Object.keys) 
     keys = Object.keys(obj); 
    else 
     keys = getObjectKeys(obj); 

    for(var i = 0; i < keys.length; i++) 
    { 
     if(typeof keys[i] === 'string') 
     { 
      PropertyScope(obj, keys[i], obj[keys[i]]); 
     } 
    } 

    return obj; 
}; 

请注意,这里不区分大小写将只适用于现有对象的属性,没有任何新的

谢谢大家

+1

我写了一个答案,但它基本上是这样的。我将在这里留下一个纯粹信息丰富的部分:“基于属性访问中使用的属性名称执行任意决策”所涵盖的行为的一般类别仅可能通过代理。没有代理对象,仅仅可能分配决策功能(即,,setter/getter)到任何给定的属性名称。换句话说,如果你没有代理,你必须提前知道属性名称;没有其他选择。 – apsillers

+0

当然!好吧,那很糟糕,但是谢谢@apillers!不能等待ECMA6! – WebWanderer