2015-05-30 79 views
0

有了關聯數組如:如何創建一個JavaScript哈希表/關聯數組原型

var m = {}; 
m['a'] = {id:1, foo:'bar'}; 
m['b'] = {id:2, foo:'bar'}; 

是否有可能創建一個原型,例如:

Array.prototype.hello = function() { console.log('hello'); } 
m.hello(); 

失敗的原因是,m是一個物體,所以我累了:

Object.prototype.hello = function() { console.log('hello'); } 

這也是有問題的。

是可以創建一個可以操作這個數據結構的原型嗎?


更新: 我想我需要一些睡眠:)

當我創建並自行使用Object.prototype.hello = function() { console.log('hello'); }它工作正常。

當我添加原型幷包含第三方JS框架時,它使框架停止工作。

回答

1

您可以將自定義屬性分配給任何對象,這意味着您可以對具有與Object.prototype不同的立即基礎原型的對象執行此操作。所以,你可以做到這一點,例如:

function MyMap() { 
} 
MyMap.prototype.hello = function() { 
    console.log('hello'); 
}; 
var m = new MyMap(); 
m['a'] = {id:1, foo:'bar'}; 
m['b'] = {id:2, foo:'bar'}; 
m.hello(); 

注意,不過,如果你存儲在hello項:

m['hello'] = {id:3, foo:'bar'}; 

...這將隱藏你的對象從獲取hello原型。

另外請注意,您的m將有性能不僅來自MyMap.prototype,但也從Object.prototype(如{}一樣),像toStringvalueOfhasOwnProperty。如果你想Object屬性,你可以做到這一點,太:

function MyMap() { 
} 
MyMap.prototype = Object.create(null); 
MyMap.prototype.hello = function() { 
    console.log('hello'); 
}; 

還要注意的是構造函數(MyMap,以上)是唯一的方法來創建與下面的原型對象。你可以只用Object.create直接:

var mapPrototype = { 
    hello: function() { 
     console.log('hello'); 
    } 
}; 
var m = Object.create(mapPrototype); 
+0

我要試試你最後的建議。感謝您的幫助。 –

+0

@BrianMcGinity:不用擔心。請注意,它與其他所有人都有相同的衝突問題。 :-)解決衝突問題的唯一方法是將條目存儲在不同的對象上,例如ES6的'map'概念。 –

0

分配給Object.prototype應該可以很好地工作。當在節點上運行:

> Object.prototype.foo = function() { console.log("foo!"); } 
[Function] 
> var m = {}; 
undefined 
> m.foo(); 
foo! 
undefined 

它是否是一個好主意,是一個整體的其他討論...

2

爲什麼不能創建自己的對象構造,這樣就可以不延長的問題它的原型?

function O(o) { 
    for (var p in o) { 
     this[p] = o[p]; 
    } 
} 

O.prototype.hello = function() { console.log('hello') } 

然後用你的對象文字的構造函數。

var m = new O({}) 
m['a'] = {id:1, foo:'bar'} 
m['b'] = {id:2, foo:'bar'} 

有一些技巧會讓你放棄new如果你願意。

1

你可以使用Object.create創建您的結構類似陣列的原型。

var proto = Object.create(Array.prototype); 
proto.hello = function() { console.log('hello'); } 

然後使用它像

var stack = Object.create(proto); 
stack.hello(); 
stack.push('example'); 
相關問題