Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.07.2012, 00:26
Аватар для PRStudio
Новичок на форуме
Отправить личное сообщение для PRStudio Посмотреть профиль Найти все сообщения от PRStudio
 
Регистрация: 16.07.2012
Сообщений: 2

Нестыковка при расширении класса Object
Столкнулся с проблемой.

Расширяю класс Object своими методами, дабы потом они были доступны для DOM объектов. Вот пример метода:

Object.prototype.mymethod = function(options){
...
}


Далее, например, вызываю для какого-нибудь объекта DOM ( element.mymethod() ). Но вот проблема, в options мне нужно передать объект с параметрами {var:val ...}, однако на входе в .mymethod() я уже получаю дополнительные ключи с кодом этих самых prototype методов, т.е. вместо {var:val} получаю {mymethod:код ф-ции, var:val}. Я не могу понять, почему методы приклеиваются к объекту таким произвольным образом. Можно ли этого как-то избежать (кроме как отсеивать имена, совпадающие с методами)?
Ответить с цитированием
  #2 (permalink)  
Старый 16.07.2012, 00:39
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

PRStudio,
код функции mymethod сам добавляется потому что вы расширили прототип объектов и теперь при передаче объекта в нем автоматически присутствует эта функция
Ответить с цитированием
  #3 (permalink)  
Старый 16.07.2012, 00:46
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

PRStudio,
но это обходимая проблема
Object.prototype.mymethod = function(options){
 for (i in options) {
  if ((i + '') == 'mymethod') continue;
  //здесь будут ваши свойства без mymethod
 }
}
Ответить с цитированием
  #4 (permalink)  
Старый 16.07.2012, 00:49
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Дзен-трансгуманист,
ага расширение на сотни =), но я просто не поспел за вами и написал на скорую руку
Ответить с цитированием
  #5 (permalink)  
Старый 16.07.2012, 01:11
Аватар для PRStudio
Новичок на форуме
Отправить личное сообщение для PRStudio Посмотреть профиль Найти все сообщения от PRStudio
 
Регистрация: 16.07.2012
Сообщений: 2

Спасибо, а то я уже подумывал реально список методов составить и их вылавливать
Ответить с цитированием
  #6 (permalink)  
Старый 16.07.2012, 01:57
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Есть ещё одно решение: сделать метод mymethod неперечисляемым:
Object.defineProperty(Object.prototype, "mymethod", {
  value: function(options) {
    ...
  },
  enumerable: false
});
Ответить с цитированием
  #7 (permalink)  
Старый 16.07.2012, 02:22
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от Дзен-трансгуманист Посмотреть сообщение
oneguy,
Увы, не кроссбраузерно.
Печально Хотя, если под кроссбраузерностью понимать правильную работу в последних версиях основных браузеров, то это решение кроссбраузерно. Я, конечно, не настаиваю на правильном понимании кроссбраузерности, просто заметил.
Цитата:
Да и где гарантия, что прототип не будет достроен обычным способом в каком-нибудь скрипте по соседству?
Извините, не понял вопрос: прототип какого объекта не будет достроен?
Ответить с цитированием
  #8 (permalink)  
Старый 16.07.2012, 02:55
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от Дзен-трансгуманист
Да и где гарантия, что прототип не будет расширен обычным способом в каком-нибудь скрипте по соседству? (в том смысле, что к моменту исполнения кода к прототипу уже могут быть прикручены и другие перечисляемые сущности)
Да, если перечисляемые сущности уже прикручены, то этот способ менее удобен. Но если легко сделать все свойства прототипа неперечисляемыми, и часто приходится перебирать свойства объекта-наследника, то способ с Object.defineProperty самый удобный, так как позволяет использовать for ... in.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присваивание класса при нажатии на ссылку skorpeeon Элементы интерфейса 10 25.07.2013 20:07
Удаление класса при клике на объект lukingnu jQuery 3 23.04.2012 12:14
Изменение класса в <div> при нажатии на него... xmartinesx Общие вопросы Javascript 2 08.10.2010 10:57
Добавление класса на елемент по id при фокусе на input Andrew_tl Events/DOM/Window 1 18.02.2010 19:09
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50