Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Обсуждение темы о "прототипах"


Автор: Sardar 18.6.2005, 01:10
ИЕ 5.0 держит на борту JavaScript 1.3 - весьма урезанная вещь. Уже обсуждали как привести массивы к номральному виду имплементировав методы pushpopslicesplice и другие. Теперь подумаем как поднять на ИЕ5.0 метод call и apply у функций. Эти методы позволяют запустить функцию в контексте любого обьекта, что очень удобно для создаваемых динамически различных обьектов.

Код
if(typeof(Function)!="undefined" && typeof(Function.prototype.call)!="function")
 Function.prototype.call=function(obj, args) {
   if(typeof(obj)!="object") return;
   //и так, создадим у обьекта новое рандомное не заюзанное поле, куда и включим функцию
   var name="_my_call_temp_name_"+Math.round(Math.random()*1000000);
   while(typeof(obj[name])!="undefined") name="_my_call_temp_name_".Math.round(Math.random()*1000000);
   obj[name]=this;
   //теперь вызовем усё что пришло
   var arg="";
   for(var i=1; i<arguments.length; i++) arg+=", arguments["+i+"]";
   eval("obj."+name+"("+arg.substr(2)+");");
   //теперь подчистим за собой
   delete obj[name];
 }

function test(arg1, arg2) {
  alert("Object field: "+this.field+"\nArgument 1: "+arg1+"\nArgument 2: "+arg2);
}
a={field:"pole!"};
test.call(a, "argument 1 !!!", "argument 2 !");

Аналогично пишеться apply.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)