如何创建一个Javascript哈希表/关联数组原型

How to create a Javascript Hash Table / Associate Array Prototype

本文关键字:哈希表 数组 原型 Javascript 关联 何创建 创建 一个      更新时间:2023-09-26

使用关联数组,例如:

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的属性(如{}),如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);

您可以使用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

这是否是个好主意是另一回事