Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: instanceof  (Прочитано 13645 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 22-11-2005 05:09 » 

Кто-нибудь понимает, зачем нужен этот оператор, если такие вещи не работают:
Код:

function AAA ()
{
    this.a = 'aaa';
}

function BBB ()
{
    this.b = 'bbb';
}
BBB.prototype = AAA;

var a = new BBB();

alert(
  "Object: " + (a instanceof Object)
  + "\nAAA: " + (a instanceof AAA)
  + "\nBBB: " + (a instanceof BBB)
  );
Object: true
AAA: false
BBB: true

Т.е., получается, что я не погу определить, есть ли такой производный класс в его родословной? А для чего тогда он говорит true на Object? Того же эффекта можно добится через typeof(a) == 'BBB' - тогда instanceof не нужен вообще...

Знает ли кто способ проверить, является ли объект экземплятом класса, наследованным от какого-то определенного класса?
« Последнее редактирование: 16-12-2007 18:33 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 22-11-2005 05:40 » 

Хммм...
Вот что говорит описание :
Цитата
The instanceof statement tests if an object is of a particular type. It evaluates to true if the object is that type and false if it is not. Instanceof is a reserved word and cannot be used for anything other than testing an object's type
« Последнее редактирование: 16-12-2007 18:33 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #2 : 22-11-2005 06:22 » 

Т.е., получается, что я не погу определить, есть ли такой производный класс в его родословной?
Исходя из описания выше, этот кейворд предназначен только для тестирования типа объекта.
А для чего тогда он говорит true на Object?
Ну по видимому потомучто любой объект есть типа Object.

Я с тобой согласен в том, что такой кейворд, в принципе, безполезен практически Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 22-11-2005 07:36 » 

Мда, опять тупизна реализации и баги для совместимости.  Молчу  И все это при том, что база для языка скопирована java.

Так, все же, может кто знает способ проверить?

Еще интересует способ вызова "перегруженных" методов родительского класса.
У меня некоторые наметки есть, но пока проверить не могу. Если удастся - оделюсь. Если кто знает - напишите, пожалуйста.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 22-11-2005 10:45 » 

Рома,

мне кажется, что ты от джаваскрипта хочешь слишком много.  Если ты собираешься затем использовать скрипт в веб-страничке, то лучше ограничиться минимумом возможностей, которые будут одинаково работать в разных браузерах.  Javascript только прикидывается объектно ориентированным языком, но в лично уменя ООП в Javascriprt вызвал слёзы умиления при знакомстве с языком и разные грубые слова при попытках писать в ОО стиле.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 22-11-2005 11:13 » 

Да, это не ООП язык, он только имитирует ООП. Так же, как и perl. И много я от него не жду - тут главное понять основные правила игры.
Поэтому на тупизм отвечаю тем же:
Код:
function BaseClass()
{
this.__classStack = ['BaseClass'];

this.instanceOf = function (ref, cls)
{
if (! ref || ! ref.__classStack) return false;
for (var i in ref.__classStack)
if (ref.__classStack[i] == cls) return true;
return false;
};

// ...
}

function ChildClass (args)
{
this.__proto = BaseClass;
this.__proto();
this.__classStack.unshift('ChildClass');

// ...

        this.someFunc_ = function (obj)
        {
                if (! this.instanceOf(obj, 'SomeClass')) /* error */
                // ...
        };
}
ChildClass.prototype = BaseClass;
Вот так и побеждается сырость...
По пути еще нашел такое вот обсуждение: http://forum.ru-board.com/topic.cgi?forum=31&bm=1&topic=2365

Теперь хочу понять, как вызвать "перегруженный" метод. Уродство конечно - спорить не буду, но js, в плане web, мне кажется более распространенной средой, чем java, и более гибкой, чем чистосерверные решения. Минимальная автоматизация - это не шибко интересно.
Пытаюсь работать по стандартам и учитывать "самостийность" IE.  Пока, если код корректен, в обеих браузерах пашет. Конечно, IE многого не может.: catch(e if ...) не знает (где-то читал, что грядет JavaScript 2.0, а тут с 1.5 нет полной совместимости), DOM2 реализован на уровне SARAY1, CSS2 - CSS1.5 (при том, что пора внедрять DOM3 и CSS3), встроенный в HTML XML не понимает. И этим браузером пользуется большая часть пользователей!..
« Последнее редактирование: 16-12-2007 18:34 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 22-11-2005 14:18 » 

Кстати, много интересного материала нашел:
1) реализация скрытых членов класса: http://www.crockford.com/javascript/private.html
2) рассуждения по поводу языка: http://www.crockford.com/javascript/javascript.html
3) сайт с множеством подобных материалов:
http://www.crockford.com/
http://www.crockford.com/javascript/index.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-11-2005 19:25 » new

Таки смог добиться логичного поведения instanceof: объекты, создаваемые по описаному тут методу помнят всех предков и да же можно вызвать методы предков, но это жопа, а не ООП: слишком много труда для простых вещей.
В общем, Коля, ты прав: и я дошел до грубых слов...
Напр. чего стоит вызов перегруженного метода базового класса: BaseClass.method.call(obj, ...) ,а по вышеупомянутому методу - obj.superclass.method.call(obj, ...).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 25-11-2005 12:41 » 

Дык !

Как известно, при помощи напильника можно истребитель из паровоза сделать.  По ... аться (в смысле, постараться) придётся, правда, немеряно.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 25-11-2005 14:14 » 

Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines