对象原型:所有属性不区分大小写 Getter

Object Prototype: Case Insensitive Getter On All Properties

我正在尝试让一个 Object 在我搜索 属性 时不区分大小写地执行那个 属性 的 "look-up"。

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 测试,直到那时。当我进行所有必要的更改时,此原型方法将使一切正常,并且不会将此方法放入任何生产环境中。所以,如果你打算把我打倒,甚至因为我想这样做而对我大喊大叫,我不会听的。

谢谢大家!

所以,在关注@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;
};

请注意,此处不区分大小写仅适用于现有对象属性,不适用于任何新对象属性。

谢谢大家!