#javascript #oop
#javascript #ооп
Вопрос:
Я хочу создать функцию, которая будет вести себя как метод для всех элементов, подобных методам jQuery. например:
function myFunction(p1,p2){
//things
}
element.myFunction(p1,p2);
Я думаю, что Object.prototype не разрешен .
Есть идея?? пожалуйста, я новичок в ООП в javascript. Спасибо
Комментарии:
1. Вам нужна функция с произвольным количеством аргументов? Не очень понятно, что вы имеете в виду.
2. Добавление функции в
Object.prototype
«разрешено» в том смысле, что это может быть сделано и будет работать так, как ожидалось, но это может привести ко многим проблемам, которые большинство (почти все) программистов JavaScript считают недопустимыми. Однако это есть способ, которым вы «добавляете методы ко всем (стандартным, не хостовым) объектам». Но вы хотите добавить метод к определенным объектам или действительно ко всем объектам? (ИМХО, нет особых причин делать последнее.)3. Нет!! Я отредактирую это, если это сбивает с толку
4. На самом деле вы не можете сделать это для элементов DOM во всех браузерах. Я не знаю об IE 8 и 9, но предыдущие версии не реализуют свой JavaScript DOM API таким образом, чтобы сделать это возможным.
5. jQuery не добавляет методы к объектам DOM, он добавляет их к
JQuery
объекту, который ссылается на коллекцию объектов DOM. Это тот трюк, который вы ищете?
Ответ №1:
myFunction.call(element, p1, p2);
вызовется myFunction(p1, p2)
с this
привязкой к element
, аналогично тому, как если бы myFunction
были в element.prototype
и вызывались через element.myFunction(p1, p2)
.
Комментарии:
1. Да, это то, что я собираюсь сделать.. Я просто искал, могу ли я уменьшить аргументы
2. Это действительно пустая трата времени, поскольку это просто добавляет уровень абстракции — зачем передавать элемент как this , когда вы можете передать его напрямую? Это требует меньше кода для написания и понятнее для всех.
Ответ №2:
Вы можете сделать что-то вроде этого:
$ = function (element){
return {
myFunction: function (p1,p2){
alert(element.id " " (p1 p2));
//do stuff with element and p1 and p2
}
}
}
$(document.getElementById("test")).myFunction(50,80)
Это возвращает объект с этой функцией в нем. Он использует лексическую область видимости для сохранения ссылки на элемент, который вы ему дали, при этом сохраняя возможность передавать новые параметры в myFunction
Вот jsfiddle с этим в действии! http://jsfiddle.net/vnbQU /
Комментарии:
1. Использование оболочек таким способом прекрасно, но недостатком является производительность, когда они становятся большими. jQuery страдает от необходимости каждый раз создавать свой большой объект jQuery, в то время как простые вызовы функций, которым передается элемент, этого не делают. Это тип снижения производительности, которого наследование прототипа призвано избегать.