你并没有真正的关联数组。你有索引数组,你有对象。
将来,会有一个迭代器可以愉快地遍历两者,没有任何副作用。到那时,也许人们会忘记其中的区别。
但是,这些属性仍然不是基于顺序的:
$arr = array(0, 1, "name"=>"Bob", 3);
在另一种语言中,您可能会得到一个键所在的数组:0, 1, "name", 3
在 JS 中,您会得到0, 1, 2, "name"
(或"name", 0, 1, 2
)。
所以坚持使用索引数组和具有属性的对象。
也就是说,您有多种选择。
var myFunc = function () {
var private_data = {
name : "Bob",
age : 32
};
return {
getName : function () { return private_data.name; /* or private_data["name"] if that's really what your heart longs for */ },
get : function (key) { return private_data[key] || null; },
set : function (key, val) { private_data[key] = val; }
};
};
现在一切都是私有的,您可以使用点或括号表示法通过属性名称访问它们。
如果它们可以是公共的,并且该函数总是被称为相同的东西(即:不是构造实例的构造函数),那么您可以将自己附加到实际函数:
var myFunc = function () {
myFunc.name = "Bob";
myFunc["age"] = 32;
return {
get : function (key) { return (myFunc.hasOwnProperty(key)) ? myFunc[key] : null; }
};
};
缺点(或优点)是myFunc
公共名称。因此,这些属性是可公开访问的。
走第一条路,你甚至不需要声明一个变量。您可以只使用传递给函数的对象。
var myFunc = function (dataObj) {
return {
getName : function () { return dataObj.name; },
setAge : function (val) { dataObj["age"] = val; }
};
};
var bob = myFunc({ name : "Bob" });
bob.setAge(32);
现在一切都是私人的,我什至不必声明任何东西。
只要返回了一个可公开访问的函数,闭包就会使对象保持运行,该函数仍然可以访问该函数调用的特定实例。
一旦你弄清楚了闭包,这就不成问题了。