Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   универсальный метод (https://javascript.ru/forum/events/11403-universalnyjj-metod.html)

sg550 22.08.2010 02:46

универсальный метод
 
Как можно сделать метод, который проделывал бы что-либо на любом объекте, который этот метод вызовет? То есть, например, у меня есть такая функция:
function a(){alert(this);}

и я хочу, чтоб она при применении на, например, диве, выводила "[object HTMLDivElement]". Как это можно сделать?

Octane 22.08.2010 02:55

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();

sg550 22.08.2010 03:01

Спасибо, call - почти то, что нужно. Но можно ли довести дело до того, чтобы можно было писать такой код:
document.getElementsByTagName('div').a();

?

Octane 22.08.2010 03:07

Дополнил сообщение выше.

sg550 22.08.2010 03:44

Спасибо :)


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