Для цього я віддаю перевагу використанню прототипу над окремою функцією лише для зручності використання та виразності. Я просто не люблю перетворювати об’єкти на функції, якщо цього не потрібно.
Крім того, хоча прийнята відповідь працює, я хотів отримати більш комплексне рішення як для отримання, так і для налаштування, яке б поводилось якомога більше, як нотація крапкових позначень або нотація дужок.
Маючи це на увазі, я створив кілька прототипів функцій для встановлення / отримання властивості об’єкта без урахування регістру. Ви повинні пам’ятати про ДУЖЕ відповідальність при додаванні до прототипу об’єкта. Особливо при використанні JQuery та інших бібліотек. Object.defineProperty () з переліченим значенням false було використано спеціально, щоб уникнути конфлікту з JQuery. Я також не турбувався називати функції тим, що вказує на те, що вони не враховують регістр, але ви, звичайно, могли б. Мені подобаються коротші імена.
Ось геттер:
Object.defineProperty(Object.prototype, "getProp", {
value: function (prop) {
var key,self = this;
for (key in self) {
if (key.toLowerCase() == prop.toLowerCase()) {
return self[key];
}
}
},
enumerable: false
});
Ось сетер:
Object.defineProperty(Object.prototype, "setProp", {
value: function (prop, val) {
var key,self = this;
var found = false;
if (Object.keys(self).length > 0) {
for (key in self) {
if (key.toLowerCase() == prop.toLowerCase()) {
found = true;
self[key] = val;
break;
}
}
}
if (!found) {
self[prop] = val;
}
return val;
},
enumerable: false
});
Тепер, коли ми створили ці функції, наш код надзвичайно чистий і лаконічний і просто працює.
Отримання без урахування регістру:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.getProp("FOO");
obj.getProp("fOO");
obj.getProp("CAMELCASE");
obj.getProp("CamelCase");
Налаштування без урахування регістру:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.setProp('CAmelCasE', 'super humpy');
obj.setProp('newProp', 'newval');
obj.setProp('NewProp', 'anotherval');
obj = {foo: true, Foo: false}