Перейти к содержимому

Фотография

JavaScript


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 21

#1 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 11:59

Люди, хелп!
у заказчика интерфейс определяется через .htc файл, в котором разрешаются функции .js класса
Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет
Моя задача - отслеживать, разрешена функция или нет при ее использовании
Предполагается к .htc визуально я не имею никакого доступа(просто посмотреть не могу) :-)

Один из вариантов решения - использовать в своих интересах поведение неразрешенной функции, то есть проверять является ли она членом своего класса(простите за тавтологию, но что поделаешь, так и есть)
это можно сделать в JavaScript?

теперь по порядку
допустим у нас класс Menu.js с функцией showMenu();
имеем файл Menu.htc в котором эта функция не прописана
как только я создам экземпляр класса(допустим Menu1)
и напишу Menu1.showMenu();
получу ошибку типа объект не поддерживает данный метод или поле и т д
надо не допустить эту ошибку и проверить заранее
как?
  • 0

#2 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 14 апреля 2008 - 12:41

...

Немного непонятно из описания, из-за чего такая проблема у вас возникает и что надо.
Первый вариант, самый простой, вызывать метод в try\catch блоке
Второй вариант, например такой - функция isMember
<html>
&lt;script>
function isMember(object, member){
	if(object[member]){
		return true;
	}
	return false;
}
function method1(){
	//do something
}
function MyObject(){
//	this.attribute0="ATTR 0";
	this.attribute1 = "ATTR 1";
	this.method1=function(){
		alert("METH 1");
	}
/*
	this.method2=function(){
		alert("METH 2");
	}
*/
}

var mObj = new MyObject();
if(isMember(mObj, "method1")){
	mObj.method1();
}
if(isMember(mObj, "method2")){
	mObj.method2();
}
if(isMember(mObj, "attribute0")){
	alert(mObj.attribute0);
}
if(isMember(mObj, "attribute1")){
	alert(mObj.attribute1);
}
</script>
</html>
- скопируйте текст в html файл и запустите в браузере. Можете коментировать\раскоментировать мемберов объекта MyObject (насколько понимаю, в JS классов вообще нету и HTC их не прибавляет - есть объекты)

Если вас интересует как вообще посмотреть мемберов объекта, то есть очень простой способ:
function gap(obj, obj_name, nw) {
   var result = "";
   for (var i in obj)
	  try{
		 result+=obj_name + "." + i + " = " + obj[i] + "\n<br/>";
	  }
	  catch(err){
		 result+=obj_name + "." + i + " = " + err + "\n<br/>";
	  }
   if (nw){
	  var ww=window.open("", obj_name);
	  ww.document.open("text/plain");
	  ww.document.write(result);
	  ww.document.close();
   }
   else alert(result);
}
запустите данную функцию, например так gap(document, "document") или так gap(document, "document", true) - чтобы в новом оконце открылось
  • 0
Regards,
Alexey

#3 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 13:18

спасибо
сейчас перепробую
  • 0

#4 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 13:41

не хочет с функциями, которые были объявлены через прототип
Menu.prototype.MyFunction
Menu[MyFunction] не пройдет
  • 0

#5 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 14 апреля 2008 - 14:39

не хочет с функциями, которые были объявлены через прототип
Menu.prototype.MyFunction
Menu[MyFunction] не пройдет

Что не хочет?
У меня все работает, оба моих примера: и функция gap и isMember находят функцию, добавленую через prototype.
  • 0
Regards,
Alexey

#6 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 14:50

Странно...
у меня не выводит
только те, которые напрямую были заданы, а все, которые через прототип - игнорирует
  • 0

#7 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 14 апреля 2008 - 15:21

Странно...
у меня не выводит
только те, которые напрямую были заданы, а все, которые через прототип - игнорирует

А пример можно увидеть?
  • 0
Regards,
Alexey

#8 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 15:38

да, конечно
[codebox]jswc.Menu.prototype.getLength = function()
{
return this._items.length;
};

......

if(jswc.Menu["getLength"])
{
window.alert("I am here");
}
else
{
window.alert("черт!");
}
[/codebox]
  • 0

#9 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 14 апреля 2008 - 15:39

да, конечно
[codebox]jswc.Menu.prototype.getLength = function()
{
return this._items.length;
};

......

if(jswc.Menu["getLength"])
{
window.alert("I am here");
}
else
{
window.alert("черт!");
}
[/codebox]


так вот
чертыхается....
  • 0

#10 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 15 апреля 2008 - 06:23

да, конечно

jswc.Menu.prototype.getLength = function(){	return this._items.length;};......if(jswc.Menu["getLength"]) {     window.alert("I am here"); }else {     window.alert("черт!"); }


так вот
чертыхается....

Все правильно делает. Попробуйте вызвать метод таким способом - не получится: jswc.Menu.getLength(); - напишет, что нет такого метода.
Все из-за того, что вы пытаетесь вызвать метод у объекта(а-ля класса), а не у инстанса этого объекта.

Замените теперь вот такую строчку
if(jswc.Menu["getLength"])
на две
var menu = new jswc.Menu();
if(menu["getLength"])
Чертыхаться перестанет
  • 0
Regards,
Alexey

#11 dlg99

dlg99

    Специалист

  • Members
  • PipPipPipPipPip
  • 609 сообщений
  • ФИО:Andrey Yegorov
  • Город:Redmond, WA

Отправлено 15 апреля 2008 - 07:40

да, конечно

jswc.Menu.prototype.getLength = function(){	return this._items.length;};......if(jswc.Menu["getLength"]) {     window.alert("I am here"); }else {     window.alert("черт!"); }


так вот
чертыхается....


Все правильно делает. Попробуйте вызвать метод таким способом - не получится: jswc.Menu.getLength(); - напишет, что нет такого метода.
Все из-за того, что вы пытаетесь вызвать метод у объекта(а-ля класса), а не у инстанса этого объекта.


jswc.Menu["getLength"] ни в коем случае не "вызывает" метод, а просто пытается получить значение проперти 'getLength'. Естественно, безуспешно.
Вот jswc.Menu["getLength"]() - вызывает (пытается, стольже безуспешно ;)).

не очень понял зачем создавать обьект, можно же проверить просто:

if( jswc.Menu.prototype.getLength ) {     window.alert("I am here"); }else {     window.alert("черт!"); }

  • 0
Andrey Yegorov. Изображение

#12 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 15 апреля 2008 - 08:51

jswc.Menu["getLength"] ни в коем случае не "вызывает" метод, а просто пытается получить значение проперти 'getLength'. Естественно, безуспешно.
Вот jswc.Menu["getLength"]() - вызывает (пытается, стольже безуспешно ;)).

Да не вызывает, я не и писал, что это вызов метода. Я написал, что объект jswc.Menu не имеет такого метода, и если его вызвать - то ничего не выйдет. А вот объект унаследованный(не знаю как правильно в JS назывется, то что через new создано) будет иметь такой метод.

не очень понял зачем создавать обьект, можно же проверить просто:

Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция object[member] - вернет null\undefined в случае, если объект не имеет такого мембера. А проверка только prototype - не универсальна. Да и в джаваскрипте нельзя посмотреть на parent объект для инстанса и сказать, что наш инстанс имеет все то же самое.
Пример:
var myObj1 = new Object();alert(myObj1.myFunc); //undefinedObject.prototype.myFunc=function(){	alert(9);}var myObj2 = new Object();alert(myObj1.myFunc); // oops - i'm herealert(myObj2.myFunc); // i'm here toomyObj2.myFunc=null;alert(myObj2.myFunc); // nullalert(myObj1.myFunc); // i'm still here
1) сначала myObj1 не имел мембера(метода) myFunc, но изменение в его родителе сделали метод в нем доступным. Сам инстанс myObj1 - не менялся
2) myObj2 родился уже с методом myFunc
3) но никто не мешает убрать такой метод из инстанса объекта myObj2, причем это никак не повлият на собратьев - myObj1 будет иметь такой метод. Можно это делать не только присвоеним null, но и другими методами, типа delete (не проверял - но должно сработать).
  • 0
Regards,
Alexey

#13 dashaTk

dashaTk

    Новый участник

  • Members
  • Pip
  • 9 сообщений
  • Город:Запорожье

Отправлено 15 апреля 2008 - 12:10

Спасибо большое
жалко, что мой вопрос стал причиной спора :)
хотя для меня очень информативного спора :)
  • 0

#14 dlg99

dlg99

    Специалист

  • Members
  • PipPipPipPipPip
  • 609 сообщений
  • ФИО:Andrey Yegorov
  • Город:Redmond, WA

Отправлено 16 апреля 2008 - 06:10

Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция object[member] - вернет null\undefined в случае, если объект не имеет такого мембера. А проверка только prototype - не универсальна.


дык, тут нужно смотреть на то, каким образом реализовано "Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет".
Если через prototype - то есть легковесный способ. Иначе - да, создать объект. Но делать это в случае, если можно просто проверить prototype - не стоит. Иногда на создании объекта инициализируется много всякого, вплоть до открытия/создания фаилов, коннекта к базе и т.п.
  • 0
Andrey Yegorov. Изображение

#15 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 16 апреля 2008 - 09:33

Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция object[member] - вернет null\undefined в случае, если объект не имеет такого мембера. А проверка только prototype - не универсальна.


дык, тут нужно смотреть на то, каким образом реализовано "Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет".
Если через prototype - то есть легковесный способ. Иначе - да, создать объект. Но делать это в случае, если можно просто проверить prototype - не стоит. Иногда на создании объекта инициализируется много всякого, вплоть до открытия/создания фаилов, коннекта к базе и т.п.

Вот, кстати, есть такой метод у объекта Object в MS JS.
hasOwnProperty: http://msdn2.microso...d6z(VS.85).aspx
Не знаю насколько он стандартен, но раз речь идет о HTC, то думаю в данной ситуации можно им пользоваться.
  • 0
Regards,
Alexey

#16 Gerri

Gerri

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 05 мая 2009 - 11:27

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

#17 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 05 мая 2009 - 11:59

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

Здравствуйте!
Давайте выясним, что же вам все-таки интересно узнать.
Вы пишите про Java в пост с названием JavaScript. Если для вас это одно и тоже, то вынужден разочаровать - кроме слова Java, общее у них то, что торговые марки принадлежат компании Sun Microsystems.
Далее, если речь, как вы написали, идет о тестировании Java, то что вам хочется протестировать? Виртуальную машину языка Java? Какой-то API, входящий в состав языка Java? Аппликуху написанную на языке Java?
Аналогично, про JavaScript - вы хотите тестировать интерпретатор языка JavaScript или аппликуху написанную на JavaScript? Если аппликуху, то это WebApp или нет?
Какого рода ньюансы вас интересуют?
  • 0
Regards,
Alexey

#18 Clauster

Clauster

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 913 сообщений
  • ФИО:Худобородов Валерий
  • Город:Espoo

Отправлено 05 мая 2009 - 16:06

Какого рода ньюансы вас интересуют?

Все-таки правильно будет "нюанс".
  • 0

#19 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 05 мая 2009 - 16:50

Какого рода ньюансы вас интересуют?

Все-таки правильно будет "нюанс".

Верно!
Я специально написал неправильно и выделил курсивом...
  • 0
Regards,
Alexey

#20 Gerri

Gerri

    Новый участник

  • Members
  • Pip
  • 4 сообщений

Отправлено 06 мая 2009 - 07:51

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

Здравствуйте!
Давайте выясним, что же вам все-таки интересно узнать.
Вы пишите про Java в пост с названием JavaScript. Если для вас это одно и тоже, то вынужден разочаровать - кроме слова Java, общее у них то, что торговые марки принадлежат компании Sun Microsystems.
Далее, если речь, как вы написали, идет о тестировании Java, то что вам хочется протестировать? Виртуальную машину языка Java? Какой-то API, входящий в состав языка Java? Аппликуху написанную на языке Java?
Аналогично, про JavaScript - вы хотите тестировать интерпретатор языка JavaScript или аппликуху написанную на JavaScript? Если аппликуху, то это WebApp или нет?
Какого рода ньюансы вас интересуют?



Java меня инетресует.. Дело в том что у нас на работе может быть скоро новый проект, и наши девелоперы изучают Java. А я бы хотела узнать - если есть какие-то отличия в тестировании приложений на Java и других языках - то какие, возможно можно где-то об этом прочитать.. Нельзя же быть полным бараном в этом :)
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных