универсальный метод
Как можно сделать метод, который проделывал бы что-либо на любом объекте, который этот метод вызовет? То есть, например, у меня есть такая функция:
function a(){alert(this);}
и я хочу, чтоб она при применении на, например, диве, выводила "[object HTMLDivElement]". Как это можно сделать? |
Object.prototype.a = function () {
alert(this);
};
document.createElement("div").a();
Но в IE DOM-элементы не являются потомками Object, поэтому работать не будет.Если нужно конкретно для DOM-элементов, а не всех объектов, то так:
HTMLElement.prototype.a = function () {
alert(this);
};
document.createElement("div").a();
Опять же в IE6,7 нет такого конструктора, в IE8 можно использовать конструктор Element, но только в Standards Compliant Mode.Можно динамически менять контекст вызова: http://javascript.ru/Function/call http://javascript.ru/Function/apply Или добавлять каждый раз этот метод:
function a() {
alert(this);
}
var node = document.createElement("div");
node.a = a;
node.a();
Ну и есть еще такой вариант:
function $(node) {
this.node = node;
}
$.prototype.a = function () {
alert(this.node);
};
new $(document.createElement("div")).a();
Или без new:
function $(node) {
return new $.wrapper(node);
}
$.wrapper = function (node) {
this.node = node;
};
$.wrapper.prototype = $.prototype = {
constructor: $,
a: function () {
alert(this.node);
return this;
},
b: function () {
alert(this.node.nodeName);
return this;
}
};
$(document.createElement("div")).a().b();
|
Спасибо, call - почти то, что нужно. Но можно ли довести дело до того, чтобы можно было писать такой код:
document.getElementsByTagName('div').a();
? |
Дополнил сообщение выше.
|
Спасибо :)
|
| Часовой пояс GMT +3, время: 21:34. |