Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нестыковка при расширении класса Object (https://javascript.ru/forum/misc/29891-nestykovka-pri-rasshirenii-klassa-object.html)

PRStudio 16.07.2012 00:26

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

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

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


Далее, например, вызываю для какого-нибудь объекта DOM ( element.mymethod() ). Но вот проблема, в options мне нужно передать объект с параметрами {var:val ...}, однако на входе в .mymethod() я уже получаю дополнительные ключи с кодом этих самых prototype методов, т.е. вместо {var:val} получаю {mymethod:код ф-ции, var:val}. Я не могу понять, почему методы приклеиваются к объекту таким произвольным образом. Можно ли этого как-то избежать (кроме как отсеивать имена, совпадающие с методами)?

Dim@ 16.07.2012 00:39

PRStudio,
код функции mymethod сам добавляется потому что вы расширили прототип объектов и теперь при передаче объекта в нем автоматически присутствует эта функция

Dim@ 16.07.2012 00:46

PRStudio,
но это обходимая проблема
Object.prototype.mymethod = function(options){
 for (i in options) {
  if ((i + '') == 'mymethod') continue;
  //здесь будут ваши свойства без mymethod
 }
}

Dim@ 16.07.2012 00:49

Дзен-трансгуманист,
ага расширение на сотни =), но я просто не поспел за вами и написал на скорую руку:)

PRStudio 16.07.2012 01:11

Спасибо, а то я уже подумывал реально список методов составить и их вылавливать :)

oneguy 16.07.2012 01:57

Есть ещё одно решение: сделать метод mymethod неперечисляемым:
Object.defineProperty(Object.prototype, "mymethod", {
  value: function(options) {
    ...
  },
  enumerable: false
});

oneguy 16.07.2012 02:22

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 189165)

Печально :) Хотя, если под кроссбраузерностью понимать правильную работу в последних версиях основных браузеров, то это решение кроссбраузерно. Я, конечно, не настаиваю на правильном понимании кроссбраузерности, просто заметил.
Цитата:

Да и где гарантия, что прототип не будет достроен обычным способом в каком-нибудь скрипте по соседству?
Извините, не понял вопрос: прототип какого объекта не будет достроен?

oneguy 16.07.2012 02:55

Цитата:

Сообщение от Дзен-трансгуманист
Да и где гарантия, что прототип не будет расширен обычным способом в каком-нибудь скрипте по соседству? (в том смысле, что к моменту исполнения кода к прототипу уже могут быть прикручены и другие перечисляемые сущности)

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


Часовой пояс GMT +3, время: 01:00.