如何创建 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
的属性(就像 {}
一样),例如 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');
使用关联数组如:
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
的属性(就像 {}
一样),例如 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');