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

时间:2015-06-19 18:32:44

标签: javascript prototype

我正在尝试创建一个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软件才能进行测试。这个原型方法将使我在进行所有必要的更改时一切正常,并且此方法不会被放入任何生产环境中。所以,如果你打算让我失望并且甚至在考虑这样做而对我大吼大叫,那我就不是在听。

谢谢大家!

1 个答案:

答案 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;
};

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

谢谢大家!