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

40 Наследование в JavaScript (Дмитрий Котеров)
Goto page Previous  1, 2, 3, 4, 5, 6  Next
Author Message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 7:11 pm (написано за 13 минут 11 секунд)
   Post subject:
Reply with quote

То что An6rey предложил в последнем посте вобще ни в какие ворота не влезает. Сорри за критику
В своём 154 посте вопросом "Как вызвать функцию c0 с функции c1?" хотел натолкнуть всех на код:
Code (JavaScript): скопировать код в буфер обмена
var XXX= function(){}
XXX.prototype= {};
XXX.prototype.f1= function c0(){...};

var A= function(){};
A.prototype= new XXX();
A.prototype.f1= function c1() {
  this.constructor.prototype.f1.call(this); // aka inherit
  /* Вот это проблема JavaScript'a и есть. Проблема невозможности вызова следующей функции в цепочке прототипов
  Тут this - это объект B, а его конструктор класс A
  А следовательно этим вызовом мы фактически делаем:
  A.prototype.f1.call(this); // и никакой это не вызов базовой функции, а ОБЫЧНАЯ РЕКУРСИЯ!!!
  конструкцию this.constructor.prototype для inherit целей уж никак использовать нельзя
  поэтому ... (см. ниже)
  */

  ...
  }

var B = new A();
B.f1= function c2() {
  this.constructor.prototype.f1.call(this); //aka inherit
  ....
  };

B.f1();
Quote:
Возможно, вас спасет вызов f1 в контексте прототипа, хотя это зависит от вашей задачи.
... поэтому меня спасает вызов фукнкции прототипа в контексте объекта.
Code (JavaScript): скопировать код в буфер обмена
var XXX= function(){}
XXX.prototype= {};
XXX.prototype.f1= function c0(){...};

var A= function(){};
A.prototype= new XXX();
A.prototype.f1= function c1() {
  XXX.prototype.f1.apply( this, arguments );
  ...
  }

var B = new A();
B.f1= function c2() {
  А.prototype.f1.apply( this, arguments );
  ....
  };

B.f1();
А задача - это вызов функции с базового класса.
Т.к. мы знаем что B порожден c А, то в вызове пишем A.prototype
Т.к. мы знаем что A порожден c XXX, то в вызове пишем XXX.prototype
Чтобы не засорять глобальное пространство имён можно ложить все наши классы в хэш
Code (JavaScript): скопировать код в буфер обмена
 
Тогда в функциях нужно будет писать:
Code (JavaScript): скопировать код в буфер обмена
  Class.А.prototype.f1.apply( this, arguments );
  Class.XXX.prototype.f1.apply( this, arguments );
Что порождает 2 проблемы, указанные выше:
1) Нужно держать хеш всех конструкторов
2) При изменении имени класса нужно заменять по всему тексту TThisClass на TNewClass

Так что задачка пока остаётся нерешенной :`-(
PS. Опять сорри за нерабочий код, вылизывать не буду. Главное смысл не потерян...



Ну а теперь пару комментариев по поводу
// Create proper-derivable "class".
// Version: 1.2
=)
1. Создавать классы можно гораздо проще, без добавления дополнительного свойства
Code (JavaScript): скопировать код в буфер обмена
if (clazz.preparing) return delete(clazz.preparing); //
 
2. Бяка, непонятно зачем нужная %-)
Code (JavaScript): скопировать код в буфер обмена
this.constructor = clazz; // we need it!
 
3. Если не объясните почему нужна строчка (2 см. выше), то это можно тоже можно не делать
if (k != cname) clazz.prototype[k] = prop[k];
а обойтись кодом
Code (JavaScript): скопировать код в буфер обмена
if( props ) {
  for( var i in props ) {
   constr.prototype[i]= props[i];
   }
  }
4. Ну и самое важное, это невозможность определить тип объекта =(
Code (JavaScript): скопировать код в буфер обмена
  var X= newClass2();
  var A= newClass2( X );
  var B= newClass2( A );
  var a= new B();
  console.log( (a instanceof A) /*true*/, (a instanceof B)/*true*/, (a instanceof X)/*true*/, a.constructor === B /*fasle, а должно быть ture!!!*/);


Last edited by KES on Sat Sep 22, 2007 7:58 pm; edited 2 times in total
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 7:17 pm (спустя 6 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
B.constructor.prototype.f1(); //-> c1
Не-а, немного не то. Посмотрите, что там "нагородили":
Code (JavaScript): скопировать код в буфер обмена
XXX.prototype= {};
"Убили" почем зря конструктора. В вашем случае это будет так:
Code (JavaScript): скопировать код в буфер обмена
var A = function () {};
A.prototype = {};
A.prototype.f1 = function () { alert('c1'); };
И тут уже без сохранения конструктора "пиши пропало"...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 7:39 pm (спустя 22 минуты; написано за 7 секунд)
   Post subject:
Reply with quote

AKS wrote:
Посмотрите, что там "нагородили"
Видел, просто до этого был вопрос (без ответа) по более простому качественному примеру, я и ответил, а про потерю свойства вы уже сказали/намекнули. Если корректно восстанавливать ссылки на конструкторы, то delete и constructor - это инструменты прохода по цепочке, чем и нужно пользоваться...
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Sun Sep 23, 2007 2:01 am (спустя 6 часов 21 минуту; написано за 17 минут 54 секунды)
   Post subject:
Reply with quote

KES wrote:
То что An6rey предложил в последнем посте вобще ни в какие ворота не влезает. Сорри за критику
Критику принимаю.
Я ошибочно относил constructor к this, а не к prototype. С учетом этого код доработал.
Code (JavaScript): скопировать код в буфер обмена
var XXX = function Parent(){}
//XXX.prototype= {};
XXX.prototype.f1= function c0(){alert("c0")};
XXX.prototype.toString=function(){return "Parent"}

var A = function Child(){this.constructor=arguments.callee}
A.prototype = new XXX();
A.prototype.f1= function c1() {
   this.constructor.prototype.constructor.prototype.f1.call(this)
}
A.prototype.toString=function(){return "Child"}

var B = new A();
B.f1= function c2() {
   alert(this.constructor)
   alert(this.constructor.prototype)
   alert(this.constructor.prototype.constructor)
   alert(this.constructor.prototype.constructor.prototype)
   this.constructor.prototype.constructor.prototype.f1.call(this)
};

B.f1()
Конечно такой способ не имеет практической ценности.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sun Sep 23, 2007 3:09 pm (спустя 13 часов 8 минут; написано за 15 минут 52 секунды)
   Post subject:
Reply with quote

Лазил вчера на irc://irc.mozilla.org#developers
Предложили сканировать this.__proto__
Code (JavaScript): скопировать код в буфер обмена
var curr= this;
var name= arguments.callee.name;
while( curr[name] !== arguments.callee ) {
 curr= curr.__proto__;
 }

curr.__proto__[name].apply( this, arguments ); //
 
Или дождаться FFv4 где будет поддержда ECMA Script 4 где будет нормальное OOP
А по поводу JS1.7 сказали не приставать или идти на www.ecmascript.org/dev.php и предлагать новые фичи.
Сошлишь на том, что это будет очень полезной штукой, чтобы добавить в arguments свойство inherit, значением которого является указатель на следующую функцию в цепочке прототипов. Ну что ж, теперь надо постараться хорошо описать проблему, запостить в www.ecmascript.org/dev.php и надеяться что в JSv1.8 появится новое свойство в arguments B-)


По поводу:
Code (JavaScript): скопировать код в буфер обмена
this.constructor.prototype.f1.call(this);
и
delete B.f1;
B.f1(); //-> c1
B.f1 = temp;
B.f1(); //-> c2
 
В реальных приложениях так делать нельзя. Потому что не известно на каком уровне наша функция находится в цепочке прототипов
1-й уровень: this.constructor.prototype
2-й уровень: this.constructor.prototype.constructor.prototype
....
А что если:
Code (JavaScript): скопировать код в буфер обмена
functiona A(){};
A.prototype.f1= function(){};
function B(){};
B.prototype = new A();
B.prototype.f1= function() {
 this.constructor.prototype.f1.apply( this, arguments ); //
 //
 this.constructor.prototype.constructor.prototype.f1.apply( this, arguments ); //
 //
 //
 Class.A.prototype.f1.apply( this, arguments );
 //
 A.prototype.f1.apply( this, arguments );
 }
function C(){};
C.prototype= new B();
C.prototype.f1= function() {
 this.constructor.prototype.f1.apply( this, arguments );
 }

var test1= new B();
var test2= new C();
Вот такая вот незадача %)
Философский вопросик:
Почему же в JavaScript придумали перезагрузку функций (class.prototype) и забыли механизмы вызова перезагруженной функции???
Всем спасибо!
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Sun Sep 23, 2007 3:19 pm (спустя 9 минут; написано за 53 секунды)
   Post subject:
Reply with quote

Это не к прототипам скорее всего относится, а к тому, что функции не привязаны к объектам (как методы к классам).
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Sep 23, 2007 3:30 pm (спустя 10 минут; написано за 14 секунд)
   Post subject:
Reply with quote

KES wrote:
1-й уровень: this.constructor.prototype
2-й уровень: this.constructor.prototype.constructor.prototype
2-ой уровень - это по дефолту (если ничего не трогать или после "трогания" вернуть всё на прежнее место) всё тот же самый первый уровень, кольцевая ссылка, ну, сколько же мы это здесь обсуждали...

Если не принимать во внимание пропиетарное свойство '__proto__', то единственной возможностью ходить по цепи прототипов универсально - это с помощью наследуемого свойства 'constructor' (если нужно удаляя/восстанавливая). Во всех ваших примерах, вы, переопределяя прототип, не восстанавливаете ссылку на "родной" конструктор, то есть кармический смысл свойства 'constructor' теряется. Точно также (удаляя/восстанавливая) можно обращаться и к отдельным наследуемым свойствам на любом уровне, но и для этого требуется корректное свойство 'constructor', другой дороги от объекта к его прототипу нет. Во всех остальных случаях остаётся только сохранять нужную структуру руками.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sun Sep 23, 2007 3:35 pm (спустя 4 минуты; написано за 1 минуту 56 секунд)
   Post subject:
Reply with quote

Была еще идея каждой функции объекта присвоить ссылку на базовый класс. Думаю это будет оптимальный вариант...
Code (JavaScript): скопировать код в буфер обмена
object.f1= function c1(){
 arguments.callee.inherit.apply( this, arguments );
 };
object.f1.inherit= superClass.prototype;
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Sep 23, 2007 5:31 pm (спустя 1 час 56 минут; написано за 3 минуты 20 секунд)
   Post subject:
Reply with quote

KES, я сегодня вспомнил, что читал как-то статейку (webreflection.blogspot.com/2007/07/625-bytes-to-extend-javascript.html), в которой мужчина предлагает свой вариант extend. Наследование как-будто в порядке - у него там реализованы super, parent (constructor остается в "живых"). Короче говоря, я сам-то слабо представляю, где бы я мог это реализовать, а вот Вы "попытайте", Вам вроде надо...
Back to top
View user's profile Send private message Send e-mail
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sun Sep 23, 2007 11:21 pm (спустя 5 часов 49 минут; написано за 21 минуту 21 секунду)
   Post subject:
Reply with quote

Quote:
This method will use a C instance as this referer but C instance will have its own properties and its own methods.
Infact C instance will have a parent property too that will be exactely B constrcutor so above example, using a new C instance, will loop recursively calling as many times as it can B.prototype.init.
Хм... тоже самое пишут, что и я тут говорил. Вот только не пойму, они что у друг друга копируют всё, перефразируют немного...
Code (JavaScript): скопировать код в буфер обмена
A.prototype.init.call(this, name);
//
A.prototype.init.apply(this, arguments);
.
. Посмотрев исходники... какой-то замудреный там код и тем более он не рабочий.
Допустим "a" экземпляр класса X2, который имеет базовым X1, который имеет базовый X0.
Пусть в каждом прототипе классов определена функция f, которая выполняется по меньшей мере 1секунду.
Для любопытных вот кусочек кода, который должен завалиться
Code (JavaScript): скопировать код в буфер обмена
setTimeout( a.f, 1500 );
a.f();
Почему должен завалиться? потому что я не проверял, это видно и так:
P=s[r]; //Сохранить текущую позицию в цепочке прототипов
s[r]=P[p][r]||s[r]; //продвинуться дальше по цепочке
t=(m?P[p][m]:P).apply(s,[].slice.call(arguments,1)); //вызвать функцию с базового класса
s[r]=P; //восстановить позицию в цепочке
Видно что всё крутится около this.parent
1. Вызов a.f();// X2.prototype.f(); a.parent= X2;
2. Первая секунда закончилась. Происходит вызов X1.prototype.f() с X2.prototype.f(); // a.parent= X1;
3. Прошло полторы секунды. Опять вызываем a.f(); //УЖЕ ВТОРУЮ!!! X2.prototype.f(); a.parent= X2;
4. Прошло 2 секунды. И по идеи должны были вызвать функцию X0.prototype.f() а вызовется X1.prototype.f(), потому что мы изменили значение a.parent в вызове (п3) испортив тем самым значение для следующего вызова в (п2)
5. Дальше поведение программы предсказать трудно, осмелюсь предположить, что будет бесконечная рекурсия в ДВА ПОТОКА!!! с поочередным вызовом функций f с обычного потока
и потока порожденным setTimeout

ЗЫ. А ВЫ ЗАДУМЫВАЛИСЬ О МНОГОПОТОЧНОМ ВЫПОЛНЕНИЕ ПРОГРАММЫ НА JavaScript???
Если нет, то вот Вам пища для ума. Еще один поток можно породить:
1. setTimeout
2. Асинхронным XMLHTTPRequest'om
Терзайте ;-)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Sep 24, 2007 6:51 am (спустя 7 часов 30 минут; написано за 7 минут 58 секунд)
   Post subject:
Reply with quote

KES wrote:
... тоже самое пишут, что и я тут говорил.
Одно дело - написать, "разжевать" на примерах, другое дело - говорить, говорить, да приговаривать... :)
KES wrote:
Почему должен завалиться? потому что я не проверял...
"Потому что я не проверял" - сильно сказано! Таких аргументов я еще не встречал. :) :) :)
Надо было проверить, прежде чем делать выводы.
KES wrote:
Дальше поведение программы предсказать трудно, осмелюсь предположить, что будет бесконечная рекурсия в ДВА ПОТОКА!!!
Из той же серии. Пусть Вы, возможно, и обладаете некими экстрасенсорными способностями, но зачем пытаться предсказывать поведение программы? По этому поводу вспоминается красивая фраза, которая "живет и рулит" на форуме xpoint (xpoint.ru/): "а что нам говорит эксперимент?" ((с) Круглов).
KES wrote:
А ВЫ ЗАДУМЫВАЛИСЬ О МНОГОПОТОЧНОМ ВЫПОЛНЕНИЕ ПРОГРАММЫ НА JavaScript???
Мы-то задумывались (мир не без добрых людей - спасибо Zeroglif'у за ссылку (и за многие другие): Threads suck (weblogs.mozillazine.org/roadmap/archives/2007/02/threads_suck.html)), а вот Вам, видимо, это еще только предстоит сделать.
KES wrote:
Терзайте
Терзайте сами, прежде, чем писать...
Back to top
View user's profile Send private message Send e-mail
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Mon Sep 24, 2007 12:21 pm (спустя 5 часов 30 минут; написано за 14 минут 47 секунд)
   Post subject:
Reply with quote

AKS wrote:
Терзайте сами, прежде, чем писать...
Не был бы уверен, не писал!
AKS wrote:
Почему должен завалиться? потому что я не проверял...
Пожалуйста приводите полные цитаты:
AKS wrote:
Почему должен завалиться? потому что я не проверял, это видно и так:
Не обязательно запускать код, чтобы сказать будет он работать или нет! Это видно и так. И обратите внимание, что слово ДОЛЖЕН выделено.
AKS wrote:
Из той же серии. Пусть Вы, возможно, и обладаете некими экстрасенсорными способностями, но зачем пытаться предсказывать поведение программы?
Внимательно прочитайте п4. Там показано, что нормальный ход программы УЖЕ! поломан. И поэтому дальнейший ход программы нас не интересует: "5. Дальше поведение программы предсказать трудно"

Вы когда нибудь пользовались XMLHTTPRequest? Если да, то наверно делали несколько асинхронных запросов и поэтому в курсе, что должна будет вызваться Ваша функция обработки ответа. Ну так вот, если Вы будете использовать глобальные переменные в Вашей функции обработки запроса и если, как минимум, 2 ответа прийдет одновременно, то результат в глобальной переменной будет испорчен, тк. будет отличаться от того, если бы ответы приходили поочередно!
Если Вы не видите ничего опасного в этом коде с сайта webreflection.blogspot.com/2007/07/625-bytes-to-extend-javascript.html
Code (JavaScript): скопировать код в буфер обмена
P=s[r],t;s[r]=P[p][r]||s[r];t=(m?P[p][m]:P).apply(s,[].slice.call(arguments,1));s[r]=P;
То это не значит, что код безопасный!
AKS wrote:
"а что нам говорит эксперимент?" ((с) Круглов)
Замечательная фраза. А эксперимент нам сказал, что неверно работает setTimeout
Code (JavaScript): скопировать код в буфер обмена
setTimeout('alert("HI");', 1000 );
for( var i=0; i<5000000; i++ ) ; //Выполняется более 2 секунд
alert('Hi1');
Результат работы: 'Hi1', потом через секунду 'HI'
А должно быть: через секунду 'HI', а потом через время 'Hi1'

Из-за бага с setTimeout этот код пока остаётся рабочим, но до тех пор, пока не исправят баг!
Code (JavaScript): скопировать код в буфер обмена
<script type="text/javascript">
/*(C)Andrea Giammarchi*/(function(c,e,p){Object[p][e]=function(){for(var T="toString",V="valueOf",a=arguments,s=this,i=0,k,t,P;i<a.length;i++){t=a[i];P=t[c][p];for(k in t)if(t.hasOwnProperty(k))s[k]=t

[k];if(t[c]!==P[c])s[c]=t[c];if(t[T]!==P[T])s[T]=t[T];if(t[V]!==P[V])s[V]=t[V]}return s};Function[p][e]=function(b){var a=arguments,f=function(){},s=this,i=1,r="parent",S="Super";if(b)f[p]=b[p];s[p]=new f;if(b)s

[p][S]=function(m){var s=this,P=s[r],t;s[r]=P[p][r]||s[r];t=(m?P[p][m]:P).apply(s,[].slice.call(arguments,1));s[r]=P;return t};while(i<a.length)s[p][e](a[i++]);s[p][c]=s;s[p][r]=b;return s}})

("constructor","extend","prototype");

function test( num ){
 console.log( num, this.Super, 'start', (new Date()).getTime(), (new Date()).getSeconds() );
 for( var i=0; i<5000000; i++ ) ; //*
 console.log( num, this.Super, 'stop', (new Date()).getTime(), (new Date()).getSeconds() );
 this.Super("a", num);
 }

function A(){};
A.prototype.a= function( num ) { console.log( num, 'aa');};
function B(){};
B.extend( A, { a: test} );
function C(){};
C.extend( B, {a: test});

var test= new C();

console.log( '!1', (new Date()).getTime(), (new Date()).getSeconds() );
setTimeout( '(new Date()).getTime();test.a(2);', 2000 );
console.log( '!2', (new Date()).getTime(), (new Date()).getSeconds() );
test.a(1);
console.log( '!3', (new Date()).getTime(), (new Date()).getSeconds() );
for( var i=0; i<5000000; i++ )//**
console.log( test, A, B, C );
console.log( '!4', (new Date()).getTime(), (new Date()).getSeconds() );

</script>
А еще из эксперимента видно, что цикл в функции (*) минимум раз в пять выполняется быстрее цикла вне функции (**), хотя они одинаковы! Ха-Ха
Вот результаты:
Code (any language): скопировать код в буфер обмена
!1 1190625182921 2
!2 1190625182921 2
1 function() start 1190625182921 2
1 function() stop 1190625183953 3 //Цикл выполнился за 1 секунду: 3-2 = 1
1 function() start 1190625183953 3
1 function() stop 1190625184984 4
1 aa
!3 1190625184984 4
Object A() B() C()
!4 1190625208921 28 //Цикл выполнялся более одной секунды: 28-4 = 24!!
2 function() start 1190625209296 29
2 function() stop 1190625210328 30
2 function() start 1190625210343 30
2 function() stop 1190625211359 31
2 aa
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Sep 24, 2007 12:30 pm (спустя 8 минут; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

KES wrote:
Результат работы: 'Hi1', потом через секунду 'HI' А должно быть: через секунду 'HI', а потом через время 'Hi1'
Да с чего Вы вдруг решили, что должно быть по-вашему???
KES wrote:
Из-за бага с setTimeout этот код пока остаётся рабочим, но до тех пор, пока не исправят баг!
Не подскажете, когда этот "баг" будет исправлен? )))))))))))))))))))
KES wrote:
А еще из эксперимента видно, что цикл в функции (*) минимум раз в пять выполняется быстрее цикла вне функции (**), хотя они одинаковы! Ха-Ха
Чему именно Вы радуетесь? Расскажите, будем радоваться вместе.
Back to top
View user's profile Send private message Send e-mail
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Mon Sep 24, 2007 1:03 pm (спустя 32 минуты; написано за 31 секунду)
   Post subject:
Reply with quote

KES, вы знаете разницу между возникновением события и его обработкой?
Классику читали? dev.opera.com/articles/view/timing-and-synchronization-in-javascript/
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Mon Sep 24, 2007 1:08 pm (спустя 5 минут)
   Post subject:
Reply with quote

developer.mozilla.org/en/docs/DOM:window.setTimeout
setTimeout
 Summary
Executes a code snippet or a function after specified delay.
AKS wrote:
KES wrote:
Результат работы: 'Hi1', потом через секунду 'HI' А должно быть: через секунду 'HI', а потом через время 'Hi1'
Да с чего Вы вдруг решили, что должно быть по-вашему???
Секунда закончится раньше, чем выполнится цикл, поэтому сразу 'HI'? а потом 'Hi1'
AKS wrote:
KES wrote:
А еще из эксперимента видно, что цикл в функции (*) минимум раз в пять выполняется быстрее цикла вне функции (**), хотя они одинаковы! Ха-Ха
Чему именно Вы радуетесь? Расскажите, будем радоваться вместе.
Т.к. не хочу плакать от изобилия unexpected результатов работы кода, поэтому смеюсь...
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Mon Sep 24, 2007 1:37 pm (спустя 28 минут; написано за 8 минут 39 секунд)
   Post subject:
Reply with quote

Г.О. Спасибо за ссылку. Очень жалко, что этой информации нет в документации по setTimeout.
Получается я делал выводы основываясь на неверной/неполной документации функции и поэтому приходил к неверным выводам

И всё таки:
Quote:
Don't use alert boxes for debugging, as they might change the logic of the program completely.
Логика кода будет испорчена, если использовать в alert(); в функции test()

Или же вот такой вот пример, где alert использован в функции ff, которая совершенно не знает, что она может испортить логику выполнения программы (Об этом, кстате в документации тоже не написано, что alert() влияет на ход выполнения программы!!). Тут всё будет зависить от того, в какой момент Вы нажмете "ОК" в появившемся окне!:
Code (JavaScript): скопировать код в буфер обмена
<script type="text/javascript">
/*(C)Andrea Giammarchi*/(function(c,e,p){Object[p][e]=function(){for(var T="toString",V="valueOf",a=arguments,s=this,i=0,k,t,P;i<a.length;i++){t=a[i];P=t[c][p];for(k in t)if(t.hasOwnProperty(k))s[k]=t

[k];if(t[c]!==P[c])s[c]=t[c];if(t[T]!==P[T])s[T]=t[T];if(t[V]!==P[V])s[V]=t[V]}return s};Function[p][e]=function(b){var a=arguments,f=function(){},s=this,i=1,r="parent",S="Super";if(b)f[p]=b[p];s[p]=new f;if(b)s

[p][s]=function(m){var s=this,P=s[r],t;s[r]=P[p][r]||s[r];t=(m?P[p][m]:P).apply(s,[].slice.call(arguments,1));s[r]=P;return t};while(i<a.length)s[p][e](a[i++]);s[p][c]=s;s[p][r]=b;return s}})

("constructor","extend","prototype");

function ff() {
 try {
  throw "dfdf";
  }
catch(e){
 alert(e);
 }

}

function test( num ){
 console.log( num, this.Super, 'start', (new Date()).getTime(), (new Date()).getSeconds() );
 for( var i=0; i<5000000; i++ ) ;
 console.log( num, this.Super, 'stop', (new Date()).getTime(), (new Date()).getSeconds() );
 if( this.parent == B && num == 1 ) ff();
 this.Super("a", num);
 }

function A(){};
A.prototype.a= function( num ) { console.log( num, 'aa');};
function B(){};
B.extend( A, { a: test} );
function C(){};
C.extend( B, {a: test});

var test= new C();

try {
console.log( '!1', (new Date()).getTime(), (new Date()).getSeconds() );
setTimeout( '(new Date()).getTime();test.a(2);', 2000 );
console.log( '!2', (new Date()).getTime(), (new Date()).getSeconds() );
test.a(1);
console.log( '!3', (new Date()).getTime(), (new Date()).getSeconds() );
for( var i=0; i<5000000; i++ ) ;
console.log( test, A, B, C );
console.log( '!4', (new Date()).getTime(), (new Date()).getSeconds() );
}
catch (e) {
 }

</script>
Back to top
View user's profile Send private message
Wolf Smith
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Sep 27, 2007 12:03 pm (спустя 2 дня 22 часа 26 минут; написано за 3 минуты 42 секунды)
   Post subject:
Reply with quote

Статья ужасна. Наследование в JavaScript реализуется гораздо проще, без всяких прототипов. В примере ниже атрибут parent можно заменить на любой другой. Также возможно множественное наследование при вызове нескольких конструкторов родительских объектов.
Code (JavaScript): скопировать код в буфер обмена
function tdynamic()
{
this.x=5;
this.y=10;
this.move=function() {alert(1);}
}

function tcar()
{
this.parent=tdynamic; // присвоить родителя
this.parent(); // вызов конструктора родителя
// дальше могут находится новые методы и атрибуты класса
}

CAR1=new tcar();
CAR1.move(); // унаследованная функция работает
 
Back to top
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Thu Sep 27, 2007 12:21 pm (спустя 18 минут; написано за 53 секунды)
   Post subject:
Reply with quote

Wolf Smith, во-первых чем проще? Во-вторых, вам не кажется, что копирование методов объекта по всему наследуемому дереву не слишком здорово?
Back to top
View user's profile Send private message
Wolf Smith
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Sep 27, 2007 12:37 pm (спустя 15 минут; написано за 3 минуты 26 секунд)
   Post subject:
Reply with quote

Проще тем, что создать производный класс возможно двумя строчками. Почему копирование методов объектов не здорово? Вам надо создавать объекты в промышленных масштабах (1000 и более) и это займёт долгое время? Я думал, что в JavaScript конструктор создаёт функции и атрибуты, которые и нужно наследовать...
Back to top
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Thu Sep 27, 2007 12:46 pm (спустя 8 минут; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

Нет. В JavaScript конструктор делает что и везде - конструирует объект. Привязывает его в нужное место в иерархии и делает начальные установки.
1000 это вполне небольшое количество.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Sep 27, 2007 1:52 pm (спустя 1 час 6 минут; написано за 44 секунды)
   Post subject:
Reply with quote

Wolf Smith wrote:
Наследование в JavaScript реализуется гораздо проще, без всяких прототипов.
Wolf Smith wrote:
CAR1.move(); // унаследованная функция работает
Да где-же в вашем примере наследование?
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Sep 27, 2007 4:22 pm (спустя 2 часа 29 минут)
   Post subject:
Reply with quote

AKS wrote:
Да где-же в вашем примере наследование?
Ну, если считать, что свойства у объекта могут быть "свои" vs. "наследуемые", то этот пример - не наследование в смысле ECMAScript (prototype-based inheritance), а энный способ создания/инициализации "своих" начальных свойств...
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Sep 27, 2007 5:00 pm (спустя 38 минут; написано за 23 минуты 50 секунд)
   Post subject:
Reply with quote

KES wrote:
ЗЫ. А ВЫ ЗАДУМЫВАЛИСЬ О МНОГОПОТОЧНОМ ВЫПОЛНЕНИЕ ПРОГРАММЫ НА JavaScript???
Если нет, то вот Вам пища для ума. Еще один поток можно породить:
1. setTimeout
2. Асинхронным XMLHTTPRequest'om
Терзайте ;-)
Увы, сейчас JS НЕ многопоточен. Ваш XMLHttpRequest отправит запрос асинхронно - да. Но функция обработчик буде ожидать освобождения интерпретатора. Аналогично и setTimeout()
Back to top
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri Sep 28, 2007 9:34 am (спустя 16 часов 34 минуты; написано за 17 секунд)
   Post subject:
Reply with quote

Гость, не будет :) XMLHttpRequest как раз страдает многопоточностью
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 1:32 pm (спустя 7 дней 3 часа 57 минут; написано за 28 минут 37 секунд)
   Post subject:
Reply with quote

Anonymous wrote:
Увы, сейчас JS НЕ многопоточен. Ваш XMLHttpRequest отправит запрос асинхронно - да. Но функция обработчик буде ожидать освобождения интерпретатора. Аналогично и setTimeout()
Сообщение за мной (сбоила сетка)
Давайте уточним. Запросы отрабатывают асинхронно. Но функция onreadystatechange получит управление
только при совбодном интерпретаторе. Вот статья на эту тему

www.javascriptkata.com/2007/06/04/ajax-and-javascript-dont-use-threads/

При разработке пула объектов XMLHttpRequest - я убедился в этом для IE, Opera, Firefox, Netscape win32.
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri Oct 05, 2007 2:02 pm (спустя 29 минут; написано за 36 секунд)
   Post subject:
Reply with quote

Quote:
Но функция onreadystatechange получит управление только при совбодном интерпретаторе
Попробуйте выполнить следующий код в IE6 и прокомментировать результаты:
Code (JavaScript): скопировать код в буфер обмена
var req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = (function() {if (req.readyState == 4) {alert('req');i = 100;}});
req.open("GET", "<url>", true);
req.send(null);

var i = 0;
while (i < 10) {i++; alert(i);}
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Fri Oct 05, 2007 3:04 pm (спустя 1 час 1 минуту; написано за 12 минут 57 секунд)
   Post subject:
Reply with quote

Г.О. wrote:
Гость, не будет :) XMLHttpRequest как раз страдает многопоточностью
Г.О., вы знаете разницу между возникновением события и его обработкой?
Классику читали? dev.opera.com/articles/view/timing-and-synchronization-in-javascript/

=)
Никакой он не многопоточный. А результаты следующие:
Code (JavaScript): скопировать код в буфер обмена
var i =0;
var req;
if( window.XMLHttpRequest ) { req= new XMLHttpRequest(); }
if( window.ActiveXObject ) { req= new ActiveXObject("Microsoft.XMLHTTP"); }
req.onreadystatechange = (function() {if (req.readyState == 4) {alert('req');i = 100;}});
req.open("GET", "test.pl", true);
req.send(null);

while (i < 10) {i++; alert(i);}
alert(i);
test.pl (для того чтобы test.pl выполнялся, нужно настроить apache)
Code (perl): скопировать код в буфер обмена
sleep (www.perldoc.com/perl5.6/pod/func/sleep.html)(10);
Для FF: 1,2,3,4,5,6,7,8,9,10,10,req
Для IE: req,100 или если вы еще не проснулись и нажимаете очень медленно:
1,req,100
1,2,req,100
....
1,2,3,4,5,6,7,8,9,10,10,req

Просто FF следует принципу, цитирую класику: "These events are added to the event-dispatch queue the same way that user-initiated events are. This means, for example, that the XMLHttpRequest response handler is not executed immediately when the content is received, but just queued in the event dispatch queue. .... ALERTS They are synchronous in the sense that the script that initiates the dialog is suspended until the dialog is closed. The script waits for the alert()-function to return before it continues." (События добавляются в очередь таким же образом как если бы они были инициализированы юзером. Это означает, для примера, что обработчик XMLHttpRequest ответа не выполняется сразу же, когда содержимое получено, а только добавляется в очередь. alert() эта функция синхронна, т.е. скрипт, который инициировал диалог останавливается до тех пор пока диалог не закроют.)

Однако, все знают, что MS никогда не следует правилам и руководствуются своими ( random ) принципами: "The tricky part is that some browsers allow events to be dispatched while the dialog is visible and waiting for some user action. This means that while one script is suspended, waiting for the alert function to return, another function might be executed as part of a different event dispatch." (некоторые обозреватели позволяют выполнятся событиям в тот момент пока диалог активен и ожидает действия пользователя. Это означает, что один скрипт остановлен до тех пор пока выполнение alert() не закончится, и другой может быть выполнен в результате нового события.)

ЗЫ. И до каких пор программеры будут поддерживать этот глюкавый броузер IE? Давно пора поставить на сайты табличку с надписью: "Наш сайт не поддерживает Ваш броузер" и внизу ссылка на FF.
Может тогда бы это заставило Microsoft следовать стандартам
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 3:15 pm (спустя 11 минут; написано за 6 минут 33 секунды)
   Post subject:
Reply with quote

Г.О. wrote:
Попробуйте выполнить следующий код в IE6 и прокомментировать результаты:
Поэкпериментировал с Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021003 на Линуксе.
Результат: 1-2-3-4-5-6-7-8-9-10-req.
Присоединяюсь к мнению KES
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri Oct 05, 2007 3:45 pm (спустя 30 минут; написано за 1 минуту 30 секунд)
   Post subject:
Reply with quote

Quote:
вы знаете разницу между возникновением события и его обработкой?
Да :)
Quote:
Никакой он не многопоточный.
Я и не утверждал, что он многопоточный.
JS однопоточный изначально, в теории и всё такое.
Я хотел показать, что теория это хорошо, но из неё всегда найдутся исключения.
Quote:
Может тогда бы это заставило Microsoft следовать стандартам
А что по вашему стандарты?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 05, 2007 3:46 pm (спустя 1 минуту 9 секунд; написано за 2 минуты 28 секунд)
   Post subject:
Reply with quote

KES wrote:
Может тогда бы это заставило Microsoft следовать стандартам
Какие стандарты Вы имели ввиду? Если "Timing and Synchronization in JavaScript" By Olav Junker Kjær - это стандарт, то там же и написано:
Quote:
...non-user-initiated events like page load, timeout handlers, and asynchronous XMLHttpRequest return handlers, might fire (during the alert).
An6rey wrote:
Присоединяюсь к мнению KES
К какому? Тому, что IE - "глюкавый броузер"?
Back to top
View user's profile Send private message Send e-mail
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 4:25 pm (спустя 38 минут; написано за 14 минут 59 секунд)
   Post subject:
Reply with quote

AKS wrote:
An6rey wrote:
Присоединяюсь к мнению KES
К какому? Тому, что IE - "глюкавый броузер"?
Речь шла о многопоточности и JS.
KES привел исчерпывающие ссылки, которые объясняют что при интерактивных операциях
(например alert) текущий скрипт приостанавливается (SUSPEND) и это дает возможность
отработать обработчикам событий (последовательно, не параллельно).

IE - является и браузером который де-факто установл современные стандарты HTML
и браузером который является нарушителем стандартов - это неизбежно для творческого процесса.
Я уважаю разработчиков IE.

Претензии KES к IE - очередь обработки событий. Если очередь обработки событий FIFO нарушается -
поведение функций-обработчиков может оказаться неожиданным для тех, кто не учитывает этот момент.

Last edited by An6rey on Fri Oct 05, 2007 4:34 pm; edited 1 time in total
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri Oct 05, 2007 4:33 pm (спустя 8 минут; написано за 15 секунд)
   Post subject:
Reply with quote

А вот без alert():
Code (JavaScript): скопировать код в буфер обмена
var req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = (function() {if (req.readyState == 4) {alert('req');d = 0;}});
req.open("GET", "<url>", true);
req.send(null);

var i = 0;
var d = 1;
while (d) {i++;}
alert(i);
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 4:43 pm (спустя 9 минут; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

Г.О. wrote:
А вот без alert():
Мой Mozilla завис и выдал предложение прервать скрипт.
Затем выдал "req".
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 05, 2007 5:12 pm (спустя 29 минут; написано за 58 секунд)
   Post subject:
Reply with quote

An6rey wrote:
KES привел исчерпывающие ссылки...
Лично я так и не понял, что и к чему цитировалось.
An6rey wrote:
...дает возможность отработать обработчикам событий (последовательно, не параллельно)
Что и с чем последовательно и не параллельно?
Back to top
View user's profile Send private message Send e-mail
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Fri Oct 05, 2007 5:45 pm (спустя 32 минуты; написано за 7 минут 2 секунды)
   Post subject:
Reply with quote

An6rey wrote:
Претензии KES к IE - очередь обработки событий. Если очередь обработки событий FIFO нарушается -
поведение функций-обработчиков может оказаться неожиданным для тех, кто не учитывает этот момент.
Вот как раз Andrea Giammarchi в своей Функции webreflection.blogspot.com/2007/07/625-bytes-to-extend-javascript.html
Code (JavaScript): скопировать код в буфер обмена
P=s[r],t;s[r]=P[p][r]||s[r];t=(m?P[p][m]:P).apply(s,[].slice.call(arguments,1));s[r]=P;
это и не учитывает. Поэтому я бы никому не советовал использовать код, представленный по ссылке выше.
AKS wrote:
"Потому что я не проверял" - сильно сказано! Таких аргументов я еще не встречал. :) :) :)
Надо было проверить, прежде чем делать выводы.
Повторюсь еще раз: "Если есть исходники, то чтобы сказать будет ли эта программа работать или нет, необязательно запускать её!"
An6rey wrote:
IE - является и браузером который де-факто установил современные стандарты HTML
и браузером который является нарушителем стандартов - это неизбежно для творческого процесса.
Я уважаю разработчиков IE.
По-мойму стандартами занимается www.w3.org/TR/ И если уж охота творческого процесса, то нужно расширять, а не изменять
Конечно спасибо Биллу за всё, что он сделал. А вот разработчикам отворот, могли бы и "чище" код писать
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 05, 2007 7:13 pm (спустя 1 час 28 минут; написано за 2 минуты 56 секунд)
   Post subject:
Reply with quote

KES, Вы можете нормально объяснить, что у Вас с IE не сложилось, и что за проблемы у Вас возникают с кодом Andrea Giammarchi?
А то я ничего не пойму - то IE "кривой", то Andrea Giammarchi что-то сделал не так, то "спасибо Биллу", то "отворот разработчикам"...
Back to top
View user's profile Send private message Send e-mail
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri Oct 05, 2007 7:54 pm (спустя 40 минут; написано за 1 минуту 36 секунд)
   Post subject:
Reply with quote

An6rey wrote:
Мой Mozilla завис и выдал предложение прервать скрипт.
Mozilla, как мы уже разобрались, действует так, как ожидается. А вот IE по прежнему рвет цикл, т.е. дело не в алерте.
KES wrote:
По-мойму стандартами занимается www.w3.org/TR/
Они занимаются рекомендациями. А последнее время вообще занимаются непойми чем. Почему Microsoft должен слушаться какого-то консорциума никто так до сих пор и не объяснил.
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 8:03 pm (спустя 9 минут; написано за 7 минут 43 секунды)
   Post subject:
Reply with quote

Г.О. wrote:
А вот без alert():
Code (JavaScript): скопировать код в буфер обмена
var req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = (function() {if (req.readyState == 4) {alert('req');d = 0;}});
req.open("GET", "<url>", true);
req.send(null);

var i = 0;
var d = 1;
while (d) {i++;}
alert(i);
Я изменил Ваш код и происходящее прояснилось

var i = 0;
var req = new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = (function() {if (req.readyState == 4) {alert('req'+i);d = 0;}});
req.open("GET", "test1.html", true);
req.send(null);

var d = 1;
while (d && i<10000000) {i++;} // величина 100... зависит от скорости коипьютера
alert(i);

Суть происходящего: onreadystatechange функция отрабатывает после окончания основного скрипта
или после выдачи сообщения "ваш скрипт тормозит - прервать?".
Но вызов функций alert() направляется в стек, что и создает иллюзию того, что onreadystatechange-функция отрабатывает
до окончания основного скрипта

Last edited by An6rey on Fri Oct 05, 2007 8:15 pm; edited 1 time in total
Back to top
View user's profile Send private message
An6rey
Участник форума



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


PostPosted: Fri Oct 05, 2007 8:10 pm (спустя 6 минут; написано за 5 минут 17 секунд)
   Post subject:
Reply with quote

AKS wrote:
An6rey wrote:
...дает возможность отработать обработчикам событий (последовательно, не параллельно)
Что и с чем последовательно и не параллельно?
Последовательно отрабатывает код JavaScript.
Каждый скрипт - основной скрипт, код функций-обработчиков событий отрабатывает от начала до конца (da capo al fine)
Исключение - выполнение интерактивных операций (alert и т.п.) - когда текущий скрипт приостанавливается
и выполняется очередной скрипт из очереди до конца скрипта.

Не параллельно выполняются любые два скрипта JavaScript
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 05, 2007 8:19 pm (спустя 8 минут; написано за 24 секунды)
   Post subject:
Reply with quote

An6rey, а IE (или мнение KES) тут причем?
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3, 4, 5, 6  Next
Page 5 of 6    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can 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