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

时间:2015-05-30 16:50:44

标签: javascript prototype associative-array

使用关联数组,例如:

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 Framework时,它会使框架停止工作。

4 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分: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');

答案 3 :(得分:0)

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

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

这是一个好主意是另一个讨论......