使用关联数组,例如:
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时,它会使框架停止工作。
答案 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
(如{}
所做的),例如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);
答案 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
这是一个好主意是另一个讨论......