如何创建一个Javascript哈希表/关联数组原型
How to create a Javascript Hash Table / Associate Array Prototype
使用关联数组,例如:
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框架时,它使框架停止工作。
为什么不创建你自己的对象构造函数,这样你就可以毫无问题地扩展它的原型?
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
。
您可以为任何对象分配自定义属性,这意味着您可以在具有不同于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
的属性(如{}
),如toString
和valueOf
和hasOwnProperty
。如果您希望而不是具有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);
您可以使用Object.create
为您的结构创建一个类似数组的原型。
var proto = Object.create(Array.prototype);
proto.hello = function() { console.log('hello'); }
然后像
一样使用var stack = Object.create(proto);
stack.hello();
stack.push('example');
赋值给对象。原型应该可以正常工作。
> Object.prototype.foo = function() { console.log("foo!"); }
[Function]
> var m = {};
undefined
> m.foo();
foo!
undefined
这是否是个好主意是另一回事
相关文章:
- 如何在JavaScript中实现哈希表
- 用JavaScript中的循环传递哈希表/字典
- 将 Javascript 哈希表用于多个 If Thens
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 使用 JavaScript 中的对象的哈希表功能
- 什么是javascript中的哈希?如何对数组使用哈希
- 如何使用哈希图或数组映射返回总数最高的类别
- 用于 C# 的类似 V8 的哈希表
- Javascript 乘法表数组
- 如何在 JavaScript 中动态创建哈希表
- 与哈希表相比,通过循环访问数组中对象的Javascript优化
- 数组哈希表上的循环
- 将动态键、值对添加到JavaScript数组或哈希表中
- 在页面加载时,如果URL哈希与数组中的某个值匹配,则滚动到具有匹配数据加载id属性的元素
- 一个数组还是多个?(哈希表)
- 用数组索引替换哈希表中的键的任何方法
- 在Javascript中使用哈希表:一个数组的数组就足够了
- 使用多个对象作为键的哈希/关联数组
- 如何将哈希映射数组插入Redis?(Node.js)
- 如何创建一个Javascript哈希表/关联数组原型