如何创建 Javascript Hash11=] / 关联数组原型

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'); } 时,它工作正常。

当我添加原型并包含第 3 方 JS 框架时,它使框架停止工作。

分配给 Object.prototype 应该可以正常工作。当 运行 在节点中:

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

这是否是个好主意是另外一个话题...

为什么不创建自己的对象构造函数,以便可以毫无问题地扩展其原型?

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');