JavaScript
#1
Отправлено 14 апреля 2008 - 11:59
у заказчика интерфейс определяется через .htc файл, в котором разрешаются функции .js класса
Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет
Моя задача - отслеживать, разрешена функция или нет при ее использовании
Предполагается к .htc визуально я не имею никакого доступа(просто посмотреть не могу) :-)
Один из вариантов решения - использовать в своих интересах поведение неразрешенной функции, то есть проверять является ли она членом своего класса(простите за тавтологию, но что поделаешь, так и есть)
это можно сделать в JavaScript?
теперь по порядку
допустим у нас класс Menu.js с функцией showMenu();
имеем файл Menu.htc в котором эта функция не прописана
как только я создам экземпляр класса(допустим Menu1)
и напишу Menu1.showMenu();
получу ошибку типа объект не поддерживает данный метод или поле и т д
надо не допустить эту ошибку и проверить заранее
как?
#2
Отправлено 14 апреля 2008 - 12:41
Немного непонятно из описания, из-за чего такая проблема у вас возникает и что надо....
Первый вариант, самый простой, вызывать метод в try\catch блоке
Второй вариант, например такой - функция isMember
<html> <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) - чтобы в новом оконце открылось
Alexey
#3
Отправлено 14 апреля 2008 - 13:18
сейчас перепробую
#4
Отправлено 14 апреля 2008 - 13:41
Menu.prototype.MyFunction
Menu[MyFunction] не пройдет
#6
Отправлено 14 апреля 2008 - 14:50
у меня не выводит
только те, которые напрямую были заданы, а все, которые через прототип - игнорирует
#8
Отправлено 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]
#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]
так вот
чертыхается....
#10
Отправлено 15 апреля 2008 - 06:23
Все правильно делает. Попробуйте вызвать метод таким способом - не получится: jswc.Menu.getLength(); - напишет, что нет такого метода.да, конечно
jswc.Menu.prototype.getLength = function(){ return this._items.length;};......if(jswc.Menu["getLength"]) { window.alert("I am here"); }else { window.alert("черт!"); }
так вот
чертыхается....
Все из-за того, что вы пытаетесь вызвать метод у объекта(а-ля класса), а не у инстанса этого объекта.
Замените теперь вот такую строчку
if(jswc.Menu["getLength"])
на две
var menu = new jswc.Menu();
if(menu["getLength"])
Чертыхаться перестанет
Alexey
#11
Отправлено 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("черт!"); }
#12
Отправлено 15 апреля 2008 - 08:51
Да не вызывает, я не и писал, что это вызов метода. Я написал, что объект jswc.Menu не имеет такого метода, и если его вызвать - то ничего не выйдет. А вот объект унаследованный(не знаю как правильно в JS назывется, то что через new создано) будет иметь такой метод.jswc.Menu["getLength"] ни в коем случае не "вызывает" метод, а просто пытается получить значение проперти 'getLength'. Естественно, безуспешно.
Вот jswc.Menu["getLength"]() - вызывает (пытается, стольже безуспешно ;)).
Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция 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 here1) сначала myObj1 не имел мембера(метода) myFunc, но изменение в его родителе сделали метод в нем доступным. Сам инстанс myObj1 - не менялся
2) myObj2 родился уже с методом myFunc
3) но никто не мешает убрать такой метод из инстанса объекта myObj2, причем это никак не повлият на собратьев - myObj1 будет иметь такой метод. Можно это делать не только присвоеним null, но и другими методами, типа delete (не проверял - но должно сработать).
Alexey
#13
Отправлено 15 апреля 2008 - 12:10
жалко, что мой вопрос стал причиной спора :)
хотя для меня очень информативного спора :)
#14
Отправлено 16 апреля 2008 - 06:10
Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция object[member] - вернет null\undefined в случае, если объект не имеет такого мембера. А проверка только prototype - не универсальна.
дык, тут нужно смотреть на то, каким образом реализовано "Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет".
Если через prototype - то есть легковесный способ. Иначе - да, создать объект. Но делать это в случае, если можно просто проверить prototype - не стоит. Иногда на создании объекта инициализируется много всякого, вплоть до открытия/создания фаилов, коннекта к базе и т.п.
#15
Отправлено 16 апреля 2008 - 09:33
Вот, кстати, есть такой метод у объекта Object в MS JS.Я так понял изначальную задачу: Есть объект - надо узнать есть ли него некий метод или нет перед вызовом этого метода. Конструкция object[member] - вернет null\undefined в случае, если объект не имеет такого мембера. А проверка только prototype - не универсальна.
дык, тут нужно смотреть на то, каким образом реализовано "Если функция в этом файле не разрешена, она ведет себя так как будто ее в классе нет".
Если через prototype - то есть легковесный способ. Иначе - да, создать объект. Но делать это в случае, если можно просто проверить prototype - не стоит. Иногда на создании объекта инициализируется много всякого, вплоть до открытия/создания фаилов, коннекта к базе и т.п.
hasOwnProperty: http://msdn2.microso...d6z(VS.85).aspx
Не знаю насколько он стандартен, но раз речь идет о HTC, то думаю в данной ситуации можно им пользоваться.
Alexey
#16
Отправлено 05 мая 2009 - 11:27
если кто-либо может порекомендовать литературу по тестированию Java - напишите плз!
что-либо, где можно узнать о всяких нюансах, которые есть в тестировании Java
#17
Отправлено 05 мая 2009 - 11:59
Здравствуйте!добрый день!
если кто-либо может порекомендовать литературу по тестированию Java - напишите плз!
что-либо, где можно узнать о всяких нюансах, которые есть в тестировании Java
Давайте выясним, что же вам все-таки интересно узнать.
Вы пишите про Java в пост с названием JavaScript. Если для вас это одно и тоже, то вынужден разочаровать - кроме слова Java, общее у них то, что торговые марки принадлежат компании Sun Microsystems.
Далее, если речь, как вы написали, идет о тестировании Java, то что вам хочется протестировать? Виртуальную машину языка Java? Какой-то API, входящий в состав языка Java? Аппликуху написанную на языке Java?
Аналогично, про JavaScript - вы хотите тестировать интерпретатор языка JavaScript или аппликуху написанную на JavaScript? Если аппликуху, то это WebApp или нет?
Какого рода ньюансы вас интересуют?
Alexey
#20
Отправлено 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 анонимных