Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Фабрика бъектов JavaScript (An6rey)
Author Message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Wed Nov 19, 2008 11:16 pm (написано за 9 минут 41 секунду)
   Post subject: Фабрика бъектов JavaScript
Reply with quote

В складе готовых решений forum.dklab.ru/viewtopic.php?t=31926 предложил возможность создания объектов с подменой прототипов таким способом
Code (JavaScript): скопировать код в буфер обмена
<script type="text/javascript">

function Fabrica(){}
Fabrica.nativePrototype = Fabrica.prototype;

function create(functionConstructor){
  Fabrica.prototype =  functionConstructor.prototype;
  var newObject = new Fabrica();
  //
  var  newArguments = [];
  for (var i = 1; i < arguments.length; i++)
    newArguments[i-1] = arguments[i];
  functionConstructor.apply(newObject, newArguments);
  return newObject;
}

//
function Object0(var0, var1) {
  this.prop0 = var0;
  this.prop1 = var1;
}

Object0.prototype.validate = function(){
  alert(this.constructor);
  alert(this instanceof Object0);
  alert(this.prop0+"//"+this.prop1);
}

function Object1(var0, var1, var2) {
  this.prop0 = var0;
  this.prop1 = var1;
  this.prop2 = var2;
}

Object1.prototype.validate = function(){
  alert(this.constructor);
  alert(this instanceof Object1);
  alert(this.prop0+"//"+this.prop1+"//"+this.prop2);
}


objRef0 = create(Object0, 1, 2);
objRef1 = create(Object1, 1, 2, 3);
objRef00 = create(Object0, 3, 4);
objRef11 = create(Object1, 4, 5, 6);

objRef0.validate();
objRef1.validate();
objRef00.validate();
objRef11.validate();


</script>
Такой код работает в IE, Opera, FF, но как справедливо заметил Rumata не работает под Windows Script Engine.
Кроме того не работал в IE фрагмент var newArguments = [].concat(arguments).slice(1);
который я заменил простым перебором argumrnts в цикле.
Если есть идеи как выполнить в Windows Script Engine или какие-либо идеи по этому поводу - прошу высказаться.
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Wed Nov 19, 2008 11:35 pm (спустя 18 минут; написано за 3 минуты 1 секунду)
   Post subject:
Reply with quote

Изменил alert на WScript.echo и работает вроде нормально. Проблема была как раз в разборе arguments.
Сорри, я хотел подсократить свой код за счет "левого" разбора аргументов,
Code (JavaScript): скопировать код в буфер обмена
function Fabrica(){};

Fabrica.nativePrototype = Fabrica.prototype;

function create(functionConstructor){
  Fabrica.prototype =  functionConstructor.prototype;
  var newObject = new Fabrica();
  Fabrica.prototype =  Fabrica.nativePrototype;
  var  newArguments = [];
  for (var i = 1; i < arguments.length; i++)
    newArguments[i-1] = arguments[i];
  functionConstructor.apply(newObject, newArguments);
  return newObject;
}


function Object0(var0, var1) {
  this.prop0 = var0;
  this.prop1 = var1;
}

Object0.prototype.validate = function(){
  WScript.echo(this)
  WScript.echo(this.constructor);
  if (this instanceof Object0)
    WScript.echo(this instanceof Object0);
  WScript.echo(this.prop0+"//"+this.prop1);
}

function Object1(var0, var1, var2) {
  this.prop0 = var0;
  this.prop1 = var1;
  this.prop2 = var2;
}

Object1.prototype.validate = function(){
  WScript.echo(this.constructor);
  if (this instanceof Object1)
    WScript.echo(this instanceof Object1);
  WScript.echo(this.prop0+"//"+this.prop1+"//"+this.prop2);
}


objRef0 = create(Object0, 1, 2);
objRef1 = create(Object1, 1, 2, 3);
objRef00 = create(Object0, 3, 4);
objRef11 = create(Object1, 4, 5, 6);
objRef0.validate();
objRef1.validate();
objRef00.validate();
objRef11.validate();
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Nov 20, 2008 12:41 am (спустя 1 час 6 минут; написано за 2 минуты 6 секунд)
   Post subject:
Reply with quote

An6rey wrote:
Такой код работает в IE... но ... не работает под Windows Script Engine.
вот это очень странно!!!
я не ожидал, что JScript в MSIE и WSH отличаются.
хотелось бы увидеть, прочитать опровержение...
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Thu Nov 20, 2008 12:52 am (спустя 10 минут; написано за 6 минут 4 секунды)
   Post subject:
Reply with quote

Rumata. Работает в WSE после замены:
Code (JavaScript): скопировать код в буфер обмена
  //--- var  newArguments = [].concat(arguments).slice(1); -- не работает в IE
  var  newArguments = [];
  for (var i = 1; i < arguments.length; i++)
    newArguments[i-1] = arguments[i];
Кроме того alert() заменяется на WScript.echo в тестирующем коде
Кстати, в хромом гугле тоже работет.
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Nov 20, 2008 2:05 am (спустя 1 час 12 минут; написано за 2 минуты 19 секунд)
   Post subject:
Reply with quote

An6rey
могу сказать, что arguments != tоypeof Array однзначно!!!
лучше создайте новый массив с необходимыми данными
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Nov 20, 2008 11:23 am (спустя 9 часов 18 минут; написано за 24 секунды)
   Post subject:
Reply with quote

Rumata wrote:
arguments != tоypeof Array
,
вы хотели сказать:
typeof arguments != Array ;)
Back to top
View user's profile Send private message Send e-mail
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Thu Nov 20, 2008 5:51 pm (спустя 6 часов 28 минут; написано за 5 минут 37 секунд)
   Post subject:
Reply with quote

Rumata wrote:
An6rey
могу сказать, что arguments != tоypeof Array однзначно!!!
лучше создайте новый массив с необходимыми данными
Да не Array, но такой код работает как было предложено KES здесь forum.dklab.ru/viewtopic.php?t=27031
Code (JavaScript): скопировать код в буфер обмена
  var  newArguments = Array.prototype.slice.call(arguments).slice(1);
Я вобщем-то так и хотел написать, но по памяти вышло [].concat.arguments.slice(1), что к несчастью сработало в O, но не работает в IE.
Ну конечно в рабочем коде следует только заполнять новый Array, как это делает например и prototype.js
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML