このため、使いやすさと表現力のために、スタンドアロン関数よりもプロトタイプを使用することを好みます。必要がなければ、オブジェクトを関数に注ぎ込むのは好きではありません。
また、受け入れられた回答は機能しますが、ネイティブのドット表記またはブラケット表記とできるだけ同じように動作する、取得と設定の両方のためのより包括的なソリューションが必要でした。
そのことを念頭に置いて、大文字と小文字を区別せずにオブジェクト プロパティを設定/取得するためのプロトタイプ関数をいくつか作成しました。Object プロトタイプに追加するときは、非常に責任があることを覚えておく必要があります。特に JQuery やその他のライブラリを使用する場合。enumerable を false に設定した Object.defineProperty() は、特に 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];
}
}
},
//this keeps jquery happy
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()) {
//set existing property
found = true;
self[key] = val;
break;
}
}
}
if (!found) {
//if the property was not found, create it
self[prop] = val;
}
return val;
},
//this keeps jquery happy
enumerable: false
});
これらの関数を作成したので、コードは非常にクリーンで簡潔になり、機能します。
大文字と小文字を区別しない取得:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.getProp("FOO"); //returns 'bar'
obj.getProp("fOO"); //returns 'bar'
obj.getProp("CAMELCASE"); //returns 'humpy'
obj.getProp("CamelCase"); //returns 'humpy'
大文字と小文字を区別しない設定:
var obj = {foo: 'bar', camelCase: 'humpy'}
obj.setProp('CAmelCasE', 'super humpy'); //sets prop 'camelCase' to 'super humpy'
obj.setProp('newProp', 'newval'); //creates prop 'newProp' and sets val to 'newval'
obj.setProp('NewProp', 'anotherval'); //sets prop 'newProp' to 'anotherval'