Есть ли простой способ удалить загрязнение пространства имен mootools? - PullRequest
6 голосов
/ 25 июля 2010

Клиентская библиотека JavaScript, которую я разработал, использует объекты как хеши в некоторых областях.Он просматривает объекты, проанализированные из данных Json, с помощью цикла for ... in, используя имя свойства в качестве ключа.например ... (псевдокод)

var conversations = {'sha1-string':{name:'foo',messages:[]}}
for(var id in conversations){
    console.log(id);
    console.log(conversations[id].name);
}

К сожалению, MooTools (и Prototype, и т. д.) добавляют методы в глобальные пространства имен, поэтому циклы my for ... in теперь выполняют итерацию при добавлении MooTools (например, limit).(вокруг, времена, каждый), вызывая ошибки, когда он применяет к ним логику, как если бы это были ожидаемые данные.

Поскольку это библиотека, я должен ожидать, что она будет использоваться с MooTools, Prototype и т. д.Есть ли простой способ обойти эту проблему?Мое текущее решение состоит в том, чтобы просто передать объект методу, который удаляет определенные записи MooTools и возвращает чистый объект, но это также означает проверку того, что добавляют Prototype и все подобные библиотеки, и кажется, что это обратный способ делать вещи.

Мое другое решение - перестать полагаться на имя свойства в качестве ключа и выполнить проверку в циклах, чтобы убедиться, что я смотрю на нужные данные.Прежде чем я сделаю это переписывание, мне интересно, есть ли у кого-нибудь лучшее / существующее решение?

Спасибо:)

Ответы [ 4 ]

4 голосов
/ 25 июля 2010

Если ваши клиентские объекты не наследуются от других пользовательских объектов, вы можете посмотреть, можете ли вы использовать метод Object.hasOwnProperty javascript, чтобы выяснить, существует ли определенное свойство в самом объекте и не находится в цепочке наследования через объект-прототип .

Для браузеров, которые не поддерживают этот метод, вы можете написать обертку, чтобы проверить:

  var hasOwnProperty = function(object, property)   {
     if(object.hasOwnProperty)  {
        return object.hasOwnProperty(property);
     }
     var prop = object[property];
     return typeof(prop) !== "undefined" && prop !== 
             object.constructor.prototype[property];
  }

Как это использовать:

for(var key in someObj) {
  if(hasOwnProperty(someObj, key)) {
    // we are good to go!
  }
}
0 голосов
/ 25 июля 2010

Поскольку "limit", "round", "times" и "each" - все это дополнительные методы прототипа Array, основной ошибкой которого является использование для for для перебора массивов.Вы должны проверить тип объекта и использовать «for in» только для объектов и «for» для массивов.Btw.«for in» - самый медленный способ перебора массивов.

0 голосов
/ 25 июля 2010

Использование MooTools и Prototype не очень хорошая идея, поскольку они модифицируют базовые прототипы и не могут мирно сосуществовать. Тем не менее, ни один из них не изменяет Object.prototype (больше), поэтому вы должны не видеть какие-либо другие свойства, кроме ваших собственных.

Вы добавили плагин, который, возможно, добавляет эти свойства там? Не могли бы вы привести более полный пример, показывающий, где перечислены эти свойства, а также версии этих библиотек, которые вы используете?

hasOwnProperty проверки решат проблему с прототипом, но в первую очередь это не нужно, поэтому, возможно, лучше выяснить, какой именно скрипт работает неправильно.

MooTools создал тип Hash только потому, что не хотел изменять Object.prototype. Вот цитата из документов:

Hash

Пользовательская реализация Object ({}), которая не учитывает прототипы при установке, получении или повторении. Полезно, потому что в JavaScript мы не можем использовать Object.prototype . Вместо этого мы можем использовать Hash.prototype!

0 голосов
/ 25 июля 2010

Если я правильно понял, вы ищете метод hasOwnProperty () .

...