我正在尝试创建一个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];
}
});
如果不是所有属性,我如何设置{{1>}的甚至一个属性是不区分大小写的?!
注意:
我知道延长Object
通常是件坏事,但我有理由。由于一些数据库更改,我需要快速修复。最终修复需要几天时间,我需要运行QA软件才能进行测试。这个原型方法将使我在进行所有必要的更改时一切正常,并且此方法不会被放入任何生产环境中。所以,如果你打算让我失望并且甚至在考虑这样做而对我大吼大叫,那我就不是在听。
谢谢大家!
答案 0 :(得分:0)
所以,在关注@apsillers评论之后,我确实解决了我的问题(我只需要支持小写和驼峰案例。这不是我认为理想的,实际上并没有回答我提出案件的问题 - 不敏感的Object属性,但我应该分享:
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;
};
请注意,此处不区分大小写仅适用于现有对象属性,而不适用于任何新属性。
谢谢大家!