扩展生活在我的命名空间中的对象

时间:2011-03-02 03:29:03

标签: javascript inheritance namespaces

我正在开发一个正在慢慢成长的小图书馆。出于这个原因,我决定将我的所有函数放入myNamespace以避免丑陋的冲突并拆分成单独的文件,以便更容易管理代码。不幸的是,当我这样做时,我打破了之前曾经工作的一些东西 - 即扩展了Array对象的功能。这是我最初的做法不起作用:

if(myNamespace === undefined) {
  var myNamespace = {};
}

myNamespace.myArray = {
    height: 0,
    width: 0
};

myNamespace.myArray.prototype = [];  

现在我做的时候:

testArray = myNamespace.myArray;

我似乎无法做到:

testArray.push("test");

我该如何解决?将代码封装在命名空间中的最佳方法是什么? 我很确定这只是我混淆定义/实例化的对象,但我根本不知道正确的方法。

1 个答案:

答案 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