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

38_JavaScript: хитрости (Дмитрий Котеров)
Goto page 1, 2  Next
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Mar 05, 2004 9:48 pm ()
   Post subject: 38_JavaScript: хитрости
Reply with quote

www.dklab.ru/chicken/nablas/38.html
www.dklab.ru/chicken/nablas/39.html
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Sat Mar 06, 2004 12:22 am (спустя 2 часа 33 минуты)
   Post subject:
Reply with quote

Интересно, ты орфографию проверяешь? (-;

Кстати, там, в 38-й набле, картинка «jshash.gif» не хочет отображаться.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sat Mar 06, 2004 12:30 am (спустя 7 минут)
   Post subject:
Reply with quote

Дмитрий Котеров:
Поменяй все «вы» на «Вы». Это не считая других ошибок. Я, что заметил, отослал.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Mar 06, 2004 1:59 am (спустя 1 час 29 минут)
   Post subject:
Reply with quote

Менять "вы" на "Вы" не буду, потому что это грамматически неверно. "Вы" с большой буквы применяется только при обращении к конкретному человеку и только в переписке. В статьях это делать неграмотно. gramota.ru рулит. (-;
Ant wrote:
Интересно, ты орфографию проверяешь?
Нет, конечно. И я писал об этом. Полагаюсь на Орфус, так значительно проще и приятнее.
Ant wrote:
картинка «jshash.gif» не хочет отображаться
Правильно, забыл я ее залить. Спасибо, сейчас исправлю.
Back to top
View user's profile Send private message Send e-mail
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Sat Mar 06, 2004 4:36 am (спустя 2 часа 37 минут)
   Post subject:
Reply with quote

В набле38 в последнем примере вместо знака "больше" стоит &lt (два раза).
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Sat Mar 06, 2004 12:21 pm (спустя 7 часов 45 минут)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Менять "вы" на "Вы" не буду, потому что это грамматически неверно. "Вы" с большой буквы применяется только при обращении к конкретному человеку и только в переписке.
Только хотел опровергнуть это тем, что ты сам в правилах поведения написал, и обломался...
Quote:
«Вы» с большой буквы — обращение к конкретному участнику (и только!), «вы» с маленькой — обращение к нескольким, либо же при публикации некоторого текста статейного вида.
Back to top
View user's profile Send private message Send e-mail
Igor Svetlickov
Сотрудник «Лаборатории»



Joined: 10 Mar 2003
Posts: 37
Карма: 2
   поощрить/наказать

Location: Киев, Украина

PostPosted: Mon Mar 08, 2004 3:49 pm (спустя 2 дня 3 часа 27 минут)
   Post subject:
Reply with quote

Дмитрий, разве не я больше года назад доказывал тебе о существование неизведанной глубины JavaScript. Некоторые темы сходны с тем, о чём мы дискутировали.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Mon Mar 08, 2004 4:04 pm (спустя 15 минут)
   Post subject:
Reply with quote

Igor Svetlickov:
Я честно говоря чуть не [self-censored], когда узнал, что заложено в JS :)

Last edited by Юрий Насретдинов on Mon Mar 08, 2004 6:49 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Mon Mar 08, 2004 5:12 pm (спустя 1 час 7 минут)
   Post subject:
Reply with quote

yUAC wrote:
[censored]
Это что, финт такой? Иль модно так нынче?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Mar 08, 2004 7:15 pm (спустя 2 часа 3 минуты)
   Post subject:
Reply with quote

Igor Svetlickov:
Ну, типа, да. (-;
Больше года назад я не знал всего того, о чем сейчас написал.

JavaScript, выходит, вообще идеально подходит для всяких объектно-ориентированных баз данных (там как раз нет никаких классов, а есть только объекты).
Back to top
View user's profile Send private message Send e-mail
Ринат Насибуллин
Guest





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


PostPosted: Tue Mar 23, 2004 2:58 pm (спустя 14 дней 19 часов 42 минуты)
   Post subject: рабочий код для IE5+, GK1+, OP7+
Reply with quote

Небольшие правки кода, чтобы работал во в броузерах IE5+, GK1+, OP7+
Code (any language): скопировать код в буфер обмена
<html>
<script language="javascript1.2">
Array.prototype.toString =
Object.prototype.toString = function() {
  var cont = '';
  for (var k in this) {
    var v = this[k];
    var vs = '';
    if (v.constructor == String) {
      vs = '"' + v + '"';
    }
    else {
      vs = v.toString();
    }
    cont += k + ': ' + vs + '\n';
  }

  //cont = cont.replace(/(.+\n)/g, '  $1');  //IE5+, GK1+, but don't work in OP7+
  var a = cont.split('\n');
  cont = '';
  for (var i in a) {
    cont += '    ' + a[i] + '\n';
  }
  var s = cont;
  if (this.constructor == Object) {
    s = "{\n"+cont+"}";
  } else if (this.constructor == Array) {
    s = "[\n"+cont+"]";
  }
  return s;
}


var hash = {
  color:    "red",
  artefact: "pill",
  actors: {
    supplier: "Morpheus",
    consumer: "Neo",
    arr: [1,2,3]
  }
}
document.write('<pre>'+hash+'</pre>');
alert(hash);

</script>
</html>
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Mar 23, 2004 7:23 pm (спустя 4 часа 24 минуты)
   Post subject:
Reply with quote

Вечно в этой Опере не все, как у людей... Знаете, какая ошибка выдается?
Code (any language): скопировать код в буфер обмена
Inline script thread
ECMAScript interpreter stack overflow (limit 10000 expressions).
Script terminated.
Дожили...

И даже более того. Простой вызов
Code (JavaScript): скопировать код в буфер обмена
cont.replace(new RegExp('xxxx(.)','mg'), "  $1");
(без присваивания значения вообще куда бы то ни было) вызывает крах. И это было еще в шестой Опере, насколько я помню. Так с тех пор они эту ошибку и не исправили. Ну как так можно. :-(
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Mar 23, 2004 7:42 pm (спустя 19 минут)
   Post subject:
Reply with quote

Я, кажется, понял, в чем штука. В Опере функция replace сама написана на JavaScript. И где-то в ее недрах вызывается Object.toString(). А я эту функцию как раз переопределяю. Вот и получается зацикливание: toString вызывает replace, а из replace вызывается toString.

Кстати, если сделать alert("".toString), то выводится следующее:
Code (JavaScript): скопировать код в буфер обмена
function replace(searchValue, replaceValue) {
        function makeReplaceString(string, loc, replaceValue, res) {
                var result = "", i = 0, last = -1, c, s = "", k, m;
                while (i < replaceValue.length) {
                        c = c;
                        m = m;
                        i++;
                        if (c != "$")
                                continue;
                        if (i == replaceValue.length)
                                break;
                        switch (replaceValue.charAt(i++)) {
                                case "$": {
                                        s = s;
                                        break;
                                }
                                case "&": {
                                        s = s;
                                        break;
                                }
                                case "`": {
                                        s = s;
                                        break;
                                }
                                case "'": {
                                        s = s;
                                        break;
                                }
                                case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": {
                                        k = k;
                                        if (i != replaceValue.length && replaceValue.charAt(i) >= "0" && replaceValue.charAt(i) <= "9")        {
                                                k = k;
                                                i++;
                                        }
                                        if (k <= res.length && res[k] !== undefined)
                                                s = s;
                                        break;
                                }
                                default: {
                                        i--;
                                        continue;
                                }
                        }
                        result += replaceValue.substring(last + 1, m) + s;
                        last = last;
                }
                return new String(result + replaceValue.substring(last + 1, i));
        }
        function do_replace(string, loc, res, nres, replaceValue) {
                var v, x;
                if (isfn) {
                        res.push(loc);
                        res.push(string);
                        v = v;
                } else v = v;
                x = x;
                x.vlength = v.length;
                return x;
        }
        var isfn = typeof replaceValue == "function";
        var string = new String(this);
        if (!isfn)
                replaceValue = replaceValue;
        if (getClass(searchValue) == "RegExp") {
                if (searchValue.global) {
                        searchValue.lastIndex = 0;
                        for (; ; ) {
                                var oldLastIndex = searchValue.lastIndex;
                                var res = searchValue.exec(string);
                                if (searchValue.lastIndex == oldLastIndex)
                                        searchValue.lastIndex++;
                                if (res == null)
                                        break;
                                var replace_result = do_replace(string, res.index, res, res.length, replaceValue);
                                searchValue.lastIndex += replace_result.vlength - res[0].length;
                                string = string;
                        }
                } else {
                        var res = searchValue.exec(string);
                        if (res != null)
                                string = string;
                }
        } else {
                searchValue = searchValue;
                var loc = string.indexOf(searchValue);
                if (loc >= 0)
                        string = string;
        }
        return String(string);
}
Это, конечно, не есть исходный код toString (об этом говорит, например, конструкции вроде string = string или то, что внутренние функции определяются, но нигде не вызываются).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Mar 23, 2004 8:07 pm (спустя 25 минут)
   Post subject:
Reply with quote

В общем, поправил функцию. Сделал чере split...join. Теперь она еще и засдэшивает кавычки и слэши, так что можно использовать строку, возвращаемую функцией toString(), в качестве валидного JS-кода.
Back to top
View user's profile Send private message Send e-mail
WebLamer
Guest





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


PostPosted: Thu Apr 15, 2004 4:55 pm (спустя 22 дня 20 часов 47 минут)
   Post subject: 38_JavaScript: хитрости
Reply with quote

Многие из этих хитростей уже давно описаны Робином Дебройлом.
  Правда для Flash ActionScript, но разницы никакой.

  Русская версия здесь:
  ч1: www.vmstudio.com/arch/oopF5_ru.zip
  ч2: www.vmstudio.com/arch/oopF5_2_ru.zip
Back to top
WebLamer
Guest





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


PostPosted: Thu Apr 15, 2004 5:07 pm (спустя 11 минут)
   Post subject: 39_JavaScript: хитрости
Reply with quote

Если быть точным,
 многие из этих хитростей, касаемых ООП.
Back to top
Sherman
Guest





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


PostPosted: Sun May 30, 2004 6:55 pm (спустя 1 месяц 15 дней 1 час 48 минут)
   Post subject:
Reply with quote

весьма интересно...
Back to top
Егор
Guest





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


PostPosted: Fri Jun 11, 2004 5:04 pm (спустя 11 дней 22 часа 9 минут)
   Post subject:
Reply with quote

а как добавить метод push и splice для Array, но так что бы в конструкции for ... in эти методы не быди индексами?
я где то читал что есть некий атрибут DontEnum, который указывает конструкции for ... in не использовать его как индекс, но как его использовать не знаю
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Jun 11, 2004 8:02 pm (спустя 2 часа 57 минут)
   Post subject:
Reply with quote

Этот атрибут, кажется, не работает в IE. А чтобы в for...in не участвовали, добавьте метод в прототип:
Code (JavaScript): скопировать код в буфер обмена
var proto = {};
proto.prototype = Array.prototype
Array.prototype = proto;
proto.funcName = function () {};
Back to top
View user's profile Send private message Send e-mail
Егор
Guest





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


PostPosted: Mon Jun 14, 2004 10:42 am (спустя 2 дня 14 часов 39 минут)
   Post subject:
Reply with quote

по поводу DontEnum, то он работает, но таким образом
Code (JavaScript): скопировать код в буфер обмена
Array.prototype.push = function(); {}
var arr = new Array();
arr.push.DontEnum = true;
вот такая фиговина

И по поводу вашего метода, он что единственный? как-то не очень красиво смотрится
Back to top
Егор
Заглянувший



Joined: 14 Jun 2004
Posts: 4
Карма: -1
   поощрить/наказать

Location: Винница Украина

PostPosted: Mon Jun 14, 2004 6:29 pm (спустя 7 часов 47 минут)
   Post subject:
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
  var proto = {};
  proto.prototype = Array.prototype;
  Array.prototype = proto;
  proto.push = function (obj2)
   {
    if (obj2.constructor == String)
     {
      this[this.length] = obj2;
     }
    else
     {
      for (var index in obj2)
       {
        this[this.length] = obj2[index];
       }
     }
    return this;
   };
var blabla = new Array();
blabla.push(new Array());
выдает тоже - у объекта нет метода или свойства, броузер MSIE 5.01, в MSIE 6 работает (кроме того что там есть этот метод встроеный)
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Jun 15, 2004 11:01 pm (спустя 1 день 4 часа 31 минуту)
   Post subject:
Reply with quote

Что-то я туплю. Вот же код:
Code (JavaScript): скопировать код в буфер обмена
Array.prototype.push1 = function (obj2) { alert(1) };
var blabla = new Array();
blabla.push1();
И, кстати, в статье даже есть пример на эту тему.
Back to top
View user's profile Send private message Send e-mail
Егор
Заглянувший



Joined: 14 Jun 2004
Posts: 4
Карма: -1
   поощрить/наказать

Location: Винница Украина

PostPosted: Thu Jun 17, 2004 12:18 pm (спустя 1 день 13 часов 17 минут)
   Post subject:
Reply with quote

А теперь попробуй так:
Code (JavaScript): скопировать код в буфер обмена
Array.prototype.push = function (obj2) { alert(1) };
var blabla = new Array("1","2");
for (var i in blabla)
 {
  alert(i);
 }
как я и говорил в броузере MSIE 5.01(видимо во всех до 5.5) первый индекс будет - push, в MSIE 6(видать от 5.5) так как метод такой уже есть и атрибут DontEnum у него определен как true то мы просто переопределяем метод push, атрибут DontEnum остается true, в связи с этим индексом он не будет.
Так вот, как же задать атрибут DontEnum для еще не объявленного объекта?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Jun 17, 2004 4:59 pm (спустя 4 часа 40 минут)
   Post subject:
Reply with quote

Похоже, у встроенных объектов нельзя переопределять прототипы:
Code (html): скопировать код в буфер обмена
<script> (december.com/html/4/element/script.html)
var p = Array.prototype = {
  "push1": function () {}
};
//Array.prototype.push1 = function() {};
for (var i in Array.prototype) alert("Array.prototype."+i+" exists");
for (var i in p) alert("p."+i+" exists");
</script>
Выдает, что у p есть push1, а у Array.prototype — нет.

Может, с readonly ерунда какая-нибудь? Там рядом с DontEnum нет ничего про read-only ключи?

Что касается DontEnum, то задавайте его для Array.prototype.push1 (для тестирования используйте имя push1, а не push, чтобы не было побочных эффектов). В набле написано, как работают прототипы.
Back to top
View user's profile Send private message Send e-mail
Егор
Заглянувший



Joined: 14 Jun 2004
Posts: 4
Карма: -1
   поощрить/наказать

Location: Винница Украина

PostPosted: Fri Jun 18, 2004 2:26 pm (спустя 21 час 27 минут)
   Post subject:
Reply with quote

Quote:
Каждое свойство состоит из названия, значения и набора следующих атрибутов:

Атрибут Описание
DontEnum - Свойство не должно попадать в перечисление при итерации объекта оператором for…in.
DontDelete - Попытка программно удалить данное свойство будет проигнорирована. См. описание операции delete.
ReadOnly - Неизменяемое свойство. Попытка программно изменить данное свойство будет проигнорирована. (Отметим, что в некоторых случаях значение свойства с этим атрибутом может быть изменено через внешнюю среду.)

Новое свойство объекта создается просто присваиванием ему значения. У таких свойств, созданным пользователем, все перечисленные выше атрибуты сброшены в false.
взято Программирование от RIN.RU (program.rin.ru/razdel/html/113.html)

Подбивая итоги - требовалось создать метод push для совместимости скриптов для версий JavaScript до 1.2, т.е. если версия ниже то будет организован метод (к тому что его не нужно переопределять), однако если определять его для встроеного объекта Array, то в конструкции for ... in одним из индексов будет имя метода, что совершенно не нужно
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Jun 19, 2004 1:05 am (спустя 10 часов 38 минут)
   Post subject:
Reply with quote

ReadOnly вообще как-то странно работает. Я его когда присваиваю, просто в объекте появляется свойство с таким именем, и все. Никакого эффекта защиты от записи.
Back to top
View user's profile Send private message Send e-mail
Егор
Заглянувший



Joined: 14 Jun 2004
Posts: 4
Карма: -1
   поощрить/наказать

Location: Винница Украина

PostPosted: Mon Jun 21, 2004 10:51 am (спустя 2 дня 9 часов 46 минут)
   Post subject:
Reply with quote

я так понимаю, что эти свойства определяются для всех объявленных пользовательских объектов и по умолчанию находятся в false. Однако просто так к ним доступиться нельзя (если вообще возможно). Я тоже игрался с этими свойствами как к ним пролезть так и не нашел. В инете только пишут, что они есть и что потом мы им можем поменять значения - где?, что?, как? непонятно. Может я не там искал?
Back to top
View user's profile Send private message
ReCoder
Guest





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


PostPosted: Thu Jul 01, 2004 1:39 pm (спустя 10 дней 2 часа 48 минут)
   Post subject:
Reply with quote

На эту же тему неисчерпаемости JavaScript'a:

www.crockford.com/javascript/javascript.html
Back to top
Rumata
Профессионал



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


PostPosted: Sat Sep 04, 2004 3:00 pm (спустя 2 месяца 3 дня 1 час 20 минут)
   Post subject:
Reply with quote

Quote:
... JavaScript: раз в нем нет классов, их и наследовать нельзя.

Лирическое отступление
Еще одна аналогия. В буддийской концепции ум нельзя уничтожить. Но не потому, что он прочен, как скала, непоколебим и неуничтожим, вовсе нет! Просто ум не обладает ни одним свойством, к которому можно было бы применить термин «уничтожить». А раз нельзя уничтожить часть, нельзя избавиться и от целого. Точно так же, в JavaScript наследовать классы нельзя.

Тем не менее, можно наследовать объекты. Собственно, все «наследование» сводится к присваиванию нового значения прототипу объекта (свойству prototype).
я бы сказал - что аналогия в лирическом отступлении - спорная.
классы наследовать - нельзя по причине их отсутствия,
ум уничтожить нельзя по причине ...

более простой (на мой взгляд) способ наследования чем приведен в 39 набле
Code (JavaScript): скопировать код в буфер обмена
function Class_A(a, b)
{
    this.a = a;
    this.b = b;
}

function Class_B(a, b, c)
{
    Class_A.call(this, arguments); //
    Class_A.apply(this, a, b);     //
    this.c = c;
}
Back to top
View user's profile Send private message
Rumata
Профессионал



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


PostPosted: Sat Sep 04, 2004 3:08 pm (спустя 8 минут)
   Post subject:
Reply with quote

наследование классов (объектов) достаточно просто. возникают сложности с наследованием методов: как хотелось бы написать нечто подобное
в www.crockford.com/javascript/javascript.html, не смотря на интересное изложение, ни строчки о этом
Code (JavaScript): скопировать код в буфер обмена
function Class_A()
{
    this.report = function()
    {
        alert('A');
    }
}

function Class_B()
{
    Class_A.call(this);
    this.report = function()
    {
        inherited report(); // вызов метода предка
        alert('B');
    }
}

var a = new Class_A(); a.report(); // выводит "А"
var b = new Class_A(); b.report(); // выводит "AB"
 
единственный выход пока нахожу в следующих строчках конструктора
Code (JavaScript): скопировать код в буфер обмена
    this.Class_A_report = this.report;
    this.report = function()
    {
        this.Class_A_report();
        alert('B');
    }
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Mon Sep 06, 2004 11:52 am (спустя 1 день 20 часов 44 минуты)
   Post subject:
Reply with quote

Rumata:
Не совсем понял, что именно Вам нужно...
Но описание наследования приведено здесь:
www.crockford.com/javascript/inheritance.html
Back to top
View user's profile Send private message
Rumata
Профессионал



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


PostPosted: Sat Sep 11, 2004 11:52 am (спустя 4 дня 23 часа 59 минут; написано за 2 минуты 29 секунд)
   Post subject:
Reply with quote

WingedFox:
я знаком с этой ссылкой. в своем предыдущм посте я ошибочно указал другую ссылку с того же сайта.

но ... громоздко. где-то мы с Вами затрагивали тему о простоте кода. поэтому пример из www.crockford.com/javascript/inheritance.html мне не очень нравится (но это большое имхо)
Back to top
View user's profile Send private message
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Tue Aug 23, 2005 2:25 am (спустя 11 месяцев 11 дней 14 часов 33 минуты; написано за 38 минут 45 секунд)
   Post subject:
Reply with quote

Quote:
Ключи хэша, конечно, могут представлять из себя и обычное число:

Листинг 7
var hash = {
  10: 'input x',
  20: 'print "Hello, ", x'
}
alert(hash[10]);

Тем не менее, выражение hash.0 вместо hash[0] не работает (хотя IE иногда имеет обыкновение показывать такие сообщения об ошибке:
Хоть прошло больше года, ну да ладно...

Наверно это не так. Скорее:
Если имеем объект общего вида - Object (по простому, задается как hash={}), то интерпретатор будет насильно приводить все цифровые ключи к строковым именам и, на самом деле, мы будем иметь тогда не hash[10], а hash['10'].
Если же у hash прототип Array (по простому hash=[]), то наоборот не получится создать свойство со строковым именем, которое можно преобразовано в цифровой ключ массива (интерпретатор не даст). Теперь будем иметь не hash['10'], а hash[10]. Хотя ничто нам не мешает задать у массива свойство из интерфейса объекта общего вида, например hash.proper=... , тк Array производное от Object.
ИМХО так.
Проверить сейчас не могу (голова совсем от рук отбилась), но интуитивно чувствую, что работает именно так

Я также закрываю глаза на ошибки выдаваемые ИЕ, неприятная реализация, конечно. Даже пришло на ум: "В програмировании клиентской части выбирать не приходиться" :).
Back to top
View user's profile Send private message Send e-mail
Enilatiar
Участник форума



Joined: 09 Jun 2003
Posts: 690
Карма: 24
   поощрить/наказать


PostPosted: Tue Nov 08, 2005 8:39 am (спустя 2 месяца 16 дней 6 часов 14 минут; написано за 1 минуту 16 секунд)
   Post subject:
Reply with quote

Листинг 20 (www.dklab.ru/chicken/nablas/39.html#list20) не рабочий. Мечет ошибку о том, что у v нет constructor
Чуть переписал код, чтобы работало


dump.zip
 Description:
Object's dump

Download
 Filename:  dump.zip
 Filesize:  1.09 KB
 Downloaded:  1327 Time(s)

Back to top
View user's profile Send private message
ExHealer
Участник форума



Joined: 07 Dec 2004
Posts: 73
Карма: 7
   поощрить/наказать


PostPosted: Thu Dec 01, 2005 3:15 am (спустя 22 дня 18 часов 36 минут; написано за 6 минут 27 секунд)
   Post subject:
Reply with quote

Подскажите решение.
Code (JavaScript): скопировать код в буфер обмена
var str = '';

for( var prop in window )
        str += prop + '\n';

alert( str );
В FireFox название переменных 'str' и 'prop' содержатся в выводе alert'a.
А вот в IE, ни одна переменная при обходе объекта не видна, хотя при прямом вызове window.str, все работает.
Создается впечатление что IE прячет переменные объекта window при обходе его через for( .. in .. ).

Как решить проблему для IE?

p.s.
Code (JavaScript): скопировать код в буфер обмена
alert( "str" in window );
Возвращает true
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Dec 02, 2005 11:02 am (спустя 1 день 7 часов 46 минут; написано за 33 секунды)
   Post subject:
Reply with quote

Я думаю, что если "var str" написать вне любой функции (т.е. в глобальной области видимости), то она и правда попадает в window. А если внутри функции - тогда нет. Попробуйте.
Back to top
View user's profile Send private message Send e-mail
ExHealer
Участник форума



Joined: 07 Dec 2004
Posts: 73
Карма: 7
   поощрить/наказать


PostPosted: Mon Dec 05, 2005 5:22 pm (спустя 3 дня 6 часов 20 минут; написано за 4 минуты 31 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Я думаю, что если "var str" написать вне любой функции (т.е. в глобальной области видимости), то она и правда попадает в window. А если внутри функции - тогда нет. Попробуйте.
Это естественно. Область действия переменной внутри функции ограничена функцией.

А если написать вне любой функции, попадать-то попадёт, но вот через for( .. in .. ) в IE не видна.

Решение найдено.
Code (JavaScript): скопировать код в буфер обмена
var str = 'test';
window.str = str;
Тогда и через for( .. in .. ) переменная видна.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Mon Dec 05, 2005 6:05 pm (спустя 42 минуты; написано за 2 минуты 37 секунд)
   Post subject:
Reply with quote

ExHealer
А зачем так извращаться-то?
var это специальный оператор, объявляющий переменную в локальной области видимости.
Если написать без var, тогда она попадёт в перечисление через for..in

Кстати, FYI, t2 выполняется примерно в 2 - 2.5 раза дольше.
Code (JavaScript): скопировать код в буфер обмена
function t1 () {
  var i = 0;
  for ( var a=0; a<100000; a++) {
    i++;
  }
}

var k = 0;
function t2 () {
  for ( var a=0; a<100000; a++) {
    k++;
  }
}


var ot = new Date();
t1();
var nt = new Date();
alert(nt-ot);

var ot = new Date();
t2();
var nt = new Date();
alert(nt-ot);
Back to top
View user's profile Send private message
ExHealer
Участник форума



Joined: 07 Dec 2004
Posts: 73
Карма: 7
   поощрить/наказать


PostPosted: Tue Dec 06, 2005 4:43 am (спустя 10 часов 38 минут; написано за 3 минуты 53 секунды)
   Post subject:
Reply with quote

WingedFox
Точно во всех браузерах попадет?

Извращаться для того чтобы сделать следующее:
Code (JavaScript): скопировать код в буфер обмена
span class="st0">'.show', 2000 );
        }
        function show() {
                alert( 'passed' );
        }
        this.show                = show;
}
С помощью for .. in .. можно получить полную инкапсуляцию указателя внутри объекта n1.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Dec 06, 2005 12:15 pm (спустя 7 часов 31 минуту; написано за 5 минут 27 секунд)
   Post subject:
Reply with quote

ExHealer
Давайте Вы создадите новую тему в 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
Goto page 1, 2  Next
Page 1 of 2    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