2015-05-30 81 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'); 
相关问题