Расширение объектов, живущих в моем пространстве имен - PullRequest
2 голосов
/ 02 марта 2011

Я разрабатываю небольшую библиотеку, которая постепенно растет, чтобы быть не такой маленькой. По этой причине я решил поместить все свои функции в myNamespace, чтобы избежать неприятных конфликтов, и разделить их на отдельные файлы, чтобы упростить управление кодом. К сожалению, когда я сделал это, я сломал некоторые вещи, которые раньше работали, а именно - расширение функциональности объекта Array. Это был мой первоначальный подход, который не работает:

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

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

myNamespace.myArray.prototype = [];  

Теперь, когда я делаю:

testArray = myNamespace.myArray;

Кажется, я не могу сделать:

testArray.push("test");

Как я могу это исправить? Каков наилучший подход к инкапсуляции кода в пространстве имен? Я почти уверен, что я просто путаю определенные / создаваемые объекты, но просто не знаю, как это сделать.

1 Ответ

1 голос
/ 02 марта 2011

Это не проблема пространства имен - это то, как вы определяете и создаете экземпляр своего класса. Классы определяются как функции, а не как литералы объекта:

// 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" - фактический prototype все еще Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...