на самом деле это
кросспост из vingrad'а, причем не я автор, но может кто-то захочет прокомментировать:
Один из минусов любой долларовой библиотеки -- это создание лишнего объекта на каждый юзаемый в коде нод. В браузерах поддерживающих prototype для Node мы могли бы просто расширить поведение html-элементов, но поскольку в мсие они растут их com-объектов, этот способ как-бы отпадает. Старая идея имитировать prototype через behavior: url(HTMLElement.htc) страдает непреодолимым недостатком -- чрезвычайно медленной работой на большом DOM.
Способ, который хочу обсудить, имеет целью убрать создание лишнего объекта за счет расширения prototype в w3c браузерах, (но создания еще одной лишней функции-обертки в мсие). Собственно сама идея:
(function () {
var doc = document,
css = doc.styleSheets,
win = window,
etc;
var BucksObject = function (node) {
// унифицированное свойство node для доступа к ноду
this.node = node.constructor === String ? doc.getElementById(node) : node;
},
bucksPrototype = {
method : code,
etc
};
if(window.Node && Node.prototype) {
// расширение Node для стандартных браузеров
window.$ = function (node) {
if( node.constructor === String ) {
node = doc.getElementById(node)
};
// унифицированное свойство node для доступа к ноду
node.node = node;
return node;
};
expand(Node.prototype, bucksPrototype); // копирует только отсутствующие свойства
} else {
// создание объекта-обертки для браузеров без Node.prototype
window.$ = function (argument) {
return argument instanceof BucksObject ?
argument :
new BucksObject(argument)
};
// создать обертки для всех методов
for (var name in bucksPrototype) {
bucksPrototype[name] = (function(method){ return function () {
return method.apply(this.node, arguments)
}})(bucksPrototype[name]);
};
BucksObject.prototype = bucksPrototype;
};
})()