2017-10-15 102 views
0

是否可以創建可以像數組和對象一樣使用的對象?創建可以像數組和對象一樣使用的JavaScript數組對象

到目前爲止,我已經得到的最接近的是下面這只是使得你可以使用數組鍵分配一個值或對象屬性:

var ALO = { 
 
    db: {} 
 
}; 
 
Object.defineProperty(ALO, 'length', { 
 
    get: function() { 
 
    var count = 0; 
 
    for (var prop in ALO.db) { 
 
     if (ALO.db.hasOwnProperty(prop)) count++; 
 
    } 
 
    return count; 
 
    }, 
 
    enumerable: false 
 
}); 
 

 
function add(baseObj, obj) { 
 
    for (var prop in obj) { 
 
    if (obj.hasOwnProperty(prop)) { 
 
     if (!isNaN(prop)) { 
 
     //create a default string begining with i 
 
     baseObj.db["i" + prop] = obj[prop]; 
 
     } else { 
 
     baseObj.db[prop] = obj[prop]; 
 
     } 
 

 
     Object.defineProperty(baseObj, prop, { 
 
     get: function() { 
 
      return baseObj.db[prop]; 
 
     }, 
 
     set: function(newValue) { 
 
      baseObj.db[prop] = newValue; 
 
     }, 
 
     enumerable: false, 
 
     configurable: true 
 
     }); 
 

 
     Object.defineProperty(baseObj, baseObj.length - 1, { 
 
     get: function() { 
 
      return baseObj.db[prop]; 
 
     }, 
 
     set: function(newValue) { 
 
      baseObj.db[prop] = newValue; 
 
     }, 
 
     enumerable: false, 
 
     configurable: true 
 
     }); 
 
    } 
 
    } 
 
} 
 

 
add(ALO, { 
 
    "myprop": "myvalue" 
 
}); 
 
document.write(ALO["myprop"] + "<br>"); 
 
ALO[0] = "mynewvalue"; 
 
document.write(ALO["myprop"] + "<br>"); 
 
ALO["myprop"] = "mynewervalue"; 
 
document.write(ALO["myprop"]);

我想能夠自動創建分配不存在的項目時所需的內容,例如

ALO[1] = "create and assign this string"; 

ALO["somenonexistingprop"] = "another string"; 
+0

http://www.nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/ – Barmar

+0

http://2ality.com/2013/05/quirk- array-like-objects.html – Barmar

+0

你想得到什麼樣的行爲,與普通的JS對象不同,即'var a = {}'? – Ryan1729

回答

0

我相信你會發現在Javascript正常ArraysObject繼承,這意味着你可以虐待他們就像普通的對象,如果你想。

let MyArray = [1, 2, 3]; 
 
console.log('let MyArray = [1, 2, 3];'); 
 

 
console.log('Typeof MyArray = ', typeof(MyArray)); 
 

 
console.log('Wait.....'); 
 

 
console.log('So can I just assign stuff to an array like an object?'); 
 

 
MyArray['key'] = 'value'; 
 
console.log(`MyArray.key = 'value';`); 
 
console.log('console.log(MyArray.key) =>', JSON.stringify(MyArray.key)); 
 

 
console.log('Keys:', JSON.stringify(Object.keys(MyArray))); 
 
console.log('Array Length:', MyArray.length); 
 

 
console.log('TADA, the standard browser Array does what you want');

有可能的原因不能不是它是非常混亂做到這一點其他的,但我相信它會滿足您的要求,無需代碼!

編輯:在閱讀了下面的一些評論後,似乎OP由於某種原因想要訪問以Object模式添加的屬性作爲陣列成員。如果您需要,可以使用Object.keys(MyArray)而不是,如上面控制檯輸出的最後一行所示。

+0

@克雷格,這是否符合你的用例?如果沒有,請告訴我它不做什麼。 – Mobius

+0

不是。我想要使​​用索引(0,1,2,3等)或鍵('key','first_name','age'等)訪問相同的值。因此,對於返回「值」的MyArray ['key']的示例,我也希望能夠使用MyArray [3]並獲取「value」。如果我使用'key'或者3來設置新值,我會希望它同時更新。我也想要長度返回值的數量'鑰匙'和3被計爲1(同樣的事情) – Craig