我正在开发一个正在慢慢成长的小图书馆。出于这个原因,我决定将我的所有函数放入myNamespace
以避免丑陋的冲突并拆分成单独的文件,以便更容易管理代码。不幸的是,当我这样做时,我打破了之前曾经工作的一些东西 - 即扩展了Array对象的功能。这是我最初的做法不起作用:
if(myNamespace === undefined) {
var myNamespace = {};
}
myNamespace.myArray = {
height: 0,
width: 0
};
myNamespace.myArray.prototype = [];
现在我做的时候:
testArray = myNamespace.myArray;
我似乎无法做到:
testArray.push("test");
我该如何解决?将代码封装在命名空间中的最佳方法是什么? 我很确定这只是我混淆定义/实例化的对象,但我根本不知道正确的方法。
答案 0 :(得分:1)
这不是命名空间问题 - 它是关于如何定义和实例化您的类。类被定义为函数,而不是对象文字:
// define your class
ns.MyArray = function(w, h) {
this.width = w;
this.height = h;
};
// set the class prototype
ns.MyArray.prototype = [];
// instantiate
var a = new ns.MyArray(5,10);
a.push("Test");
a.length; // 1
a[0]; // "Test"
a.width; // 5
您正在做的只是创建一个对象文字,然后将其分配给testArray
变量,与此相同:
var o = {};
var testArray = o;
testArray == o; // true
我不确定我是否会预料到这种行为,但看起来分配像prototype
这样的对象文字的{width:0, height:0}
会添加一个带有“原型”键的普通字段 - 实际prototype
仍为Object
。