定義獲取和設置方法在Object
。實際上它可以被定義在dashboard
對象上,只有它的後代,但這很容易實現。
Object.prototype.get = function(prop) {
this[prop] = this[prop] || {};
return this[prop];
};
Object.prototype.set = function(prop, value) {
this[prop] = value;
}
通過使用這種方法get()
嵌套屬性迭代並調用set()
每當值必須被設置。
var dashboard = {};
dashboard.get('pages').get('user').set('settings', 'oh crap');
// could also set settings directly without using set()
dashboard.get('pages').get('user').settings = 'oh crap';
console.log(dashboard); // {pages: {user: {settings: "oh crap"}}};
您還可以擴展/修改get
方法接受嵌套屬性作爲單獨的參數或陣列或的字符串。利用這一點,你只需要調用get一次:
// get accepts multiple arguments here
dashboard.get('pages', 'user').set('settings', 'something');
// get accepts an array here
dashboard.get(['pages', 'user']).set('settings', 'something');
// no reason why get can't also accept dotted parameters
// note: you don't have to call set(), could directly add the property
dashboard.get('pages.user').settings = 'something';
更新:
由於一般返回一個對象,不知道你是否需要一個陣列或一些其他類型的get方法對象,所以你必須指定自己:
dashboard.get('pages.user').settings = [];
然後,你可以推項目的設置陣列
dashboard.get('pages.user').settings.push('something');
dashboard.get('pages.user').settings.push('something else');
要真正讓get函數從給定的字符串(如pages.user)構造對象層次結構,必須將字符串拆分爲多個部分,並檢查每個嵌套對象是否存在。下面是做到了這一點的get
修改後的版本:
Object.prototype.get = function(prop) {
var parts = prop.split('.');
var obj = this;
for(var i = 0; i < parts.length; i++) {
var p = parts[i];
if(obj[p] === undefined) {
obj[p] = {};
}
obj = obj[p];
}
return obj;
}
// example use
var user = dashboard.get('pages.user');
user.settings = [];
user.settings.push('something');
user.settings.push('else');
console.log(dashboard); // {pages: {user: {settings: ["something", "else"] }}}
// can also add to settings directly
dashboard.get('pages.user.settings').push('etc');
對不起 - 的腳本對我來說毫無意義。括號索引器的使用意味着需要動態索引對象,但是您使用的是常量。結合「你不想做這項工作」的說法,我想知道你是否知道你正在努力完成什麼。不要試圖貶低 - 只是一個觀察,爲什麼你可能不會得到你正在尋找的答案。 – 2010-03-26 19:14:03