Javascript есть ли метод

Как проверить, существует ли функция в JavaScript?

и полностью останавливается. Я хочу, чтобы он деградировал изящно, потому что это не самая важная функция в моей программе. Я попробовал typeof , но это все равно дает ту же ошибку. Любые предложения о том, как убедиться, что он существует, а затем выполнить только onChange ? (Ни один из методов ниже, кроме try catch one work)

20 ответов

Попробуйте что-то вроде этого:

if (typeof me.onChange !== "undefined") < // safe to use the function >

или еще лучше (в соответствии с комментариями UpTheCreek вверх)

if (typeof me.onChange === "function") < // safe to use the function >

@James, потому что этот оператор фактически выдает undefined исключение в JavaScript. Я попробовал это.

@UpTheCreek, это было бы немного опасно как общее решение, так как более старые версии IE рассматривают определенные функции как объекты, например, typeof window.alert === ‘object’ .

@BornToCode, потому что тогда me.onChange может быть чем-то, что оценивает true , а не обязательно функцией (например, это может быть логическое значение, строка и т. Д.). Например, см. Jsfiddle.net/j5KAF/1

@UpTheCreek и @Noyo: я пропустил ваши комментарии и столкнулся с проблемой. Я только что превратил тест в: ((typeof me.onChange === «function») || (typeof me.onChange === «object»)) Работает нормально вплоть до ie8 в моем случае.

@JulianLaval: хотя в большинстве случаев это верно, дело не в этой странности, с которой он здесь сталкивается. Обязательно прочитайте контекст. Посмотрите на его обновление; он закончил тем, что использовал попытку поймать.

@l00k l00k Я бы вообразил это, чтобы удовлетворить инструменты jslinting. Javascript ужасен для свободной типизации данных, поэтому, если вы можете использовать! == и === вместо! = И ==, то обычно это хорошая практика, просто делать это по умолчанию. Существует редко причина не делать этого.

Просто указать на очевидный typeof me.onChange === «function» не удастся, если этот глобальный me не определен.

if (obj && typeof obj === 'function')

продолжал бросать опорную ошибку, если obj оказался undefined.

В конце я сделал следующее:

if (typeof obj !== 'undefined' && typeof obj === 'function')

Коллега указал мне, что проверка, если он !== ‘undefined’ , а затем === ‘function’ , конечно, избыточен.

Читайте также:  Hitomi la reader 1551592 html

Значительно чище и отлично работает.

Изменить: я не претендую на то, чтобы знать причину (причины), почему этот ответ является принятым. Вместо этого используйте предложенное решение в Andrew Hare: https://stackoverflow.com/questions/1042138/javascript-check-if-function-exists

Вот один из способов справиться с такой ситуацией:

function js_to_as( str ) < try < me.onChange(str); >catch(err) < // Handle error(s) here >> 

Если вы используете eval для преобразования строки в функцию, и вы хотите проверить, существует ли этот метод eval’d, вам нужно использовать typeof, а вашу строку функций внутри Eval

var functionString = "nonexsitantFunction" eval("typeof " + functionString) // returns "undefined" or "function" 

Не отменяйте это и попробуйте typeof на eval. Если вы сделаете ReferenceError, вы будете брошены:

var functionString = "nonexsitantFunction" typeof(eval(functionString)) // returns ReferenceError: [function] is not defined 

Источник

Object.prototype.hasOwnProperty()

Метод hasOwnProperty() возвращает логическое значение, указывающее, содержит ли объект указанное свойство.

Синтаксис

Параметры

Имя проверяемого свойства.

Описание

Каждый объект, произошедший от Object , наследует метод hasOwnProperty . Этот метод может использоваться для определения того, содержит ли объект указанное свойство в качестве собственного свойства объекта; в отличие от оператора in , этот метод не проверяет существование свойств в цепочке прототипов объекта.

Примеры

Пример: использование hasOwnProperty для проверки существования свойства

В следующем примере определяется, содержит ли объект o свойство с именем prop :

= new Object(); o.prop = 'существует'; function changeO()  o.newprop = o.prop; delete o.prop; > o.hasOwnProperty('prop'); // вернёт true changeO(); o.hasOwnProperty('prop'); // вернёт false 

Пример: собственные и унаследованные свойства

Следующий пример показывает разницу между собственными свойствами и свойствами, унаследованными через цепочку прототипов:

= new Object(); o.prop = 'существует'; o.hasOwnProperty('prop'); // вернёт true o.hasOwnProperty('toString'); // вернёт false o.hasOwnProperty('hasOwnProperty'); // вернёт false 

Пример: обход свойств объекта

Следующий пример показывает, как итерироваться по свойствам объекта с пропуском унаследованных свойств. Обратите внимание, что цикл for. in уже проходит только по перечисляемым элементам, так что не надо на основании отсутствия не перечисляемых свойств, показываемых в цикле, считать, что метод hasOwnProperty сам ограничивает свойства только перечисляемыми элементами (как это делает метод Object.getOwnPropertyNames() ).

var buz =  fog: 'stack' >; for (var name in buz)  if (buz.hasOwnProperty(name))  alert('это точно туман (' + name + '). Значение: ' + buz[name]); > else  alert(name); // toString или что-то ещё > > 

Пример: hasOwnProperty как свойство

JavaScript не защищает имя свойства hasOwnProperty ; таким образом, вполне может существовать объект с таким свойством, поэтому для получения правильного результата нужно использовать внешний метод hasOwnProperty :

var foo =  hasOwnProperty: function()  return false; >, bar: 'Тут драконы' >; foo.hasOwnProperty('bar'); // всегда возвращает false // Используем метод hasOwnProperty другого объекта и вызываем его с передачей foo в качестве this (>).hasOwnProperty.call(foo, 'bar'); // true // Также для этих целей можно использовать свойство hasOwnProperty из прототипа Object Object.prototype.hasOwnProperty.call(foo, 'bar'); // true 

Обратите внимание, что в последнем случае новые объекты не создаются.

Спецификации

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

This page was last modified on 22 окт. 2022 г. by MDN contributors.

Your blueprint for a better internet.

Источник

Javascript есть ли метод

на одной из страниц открывается попап
в котором при выходе вызывается функция в opener окне,
но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
спасибо.

Здравствуйте, fryky, Вы писали:

F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.

Здравствуйте, fryky, Вы писали:

F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.

Так же можно проверит наличие функции в родительском окне:

 Z>if( ObjectName.MethodName ) < // ObjectName.MethodName - без скобок Z>. Z>> Z>

спасибо за оперативность ))
только я забыл указать. что это делается под IE5
и у него вылетает ошибка ((

 Z>>if( ObjectName.MethodName )< // ObjectName.MethodName - без скобок Z>> . Z>>> Z>>

F>спасибо за оперативность ))
F>только я забыл указать. что это делается под IE5
F>и у него вылетает ошибка ((

Странно, к сожалению проверить не могу, т.к. в наличие есть только IE6.
По идее ObjectName.MethodName текст метода или ‘undefined’ — если не определён.

А можно поподробней представить код и сообщение об ошибке?

При первом же обращении в проверке IF он вызывает ошибку, и прерывает дальнейшее выполнение скрипта.
Ие5 скудно ругается
говорит
«неопределенная ошибка» и номер строки

Здравствуйте, fryky, Вы писали:

F>При первом же обращении в проверке IF он вызывает ошибку, и прерывает дальнейшее выполнение скрипта.
F>Ие5 скудно ругается
F>говорит
F>»неопределенная ошибка» и номер строки

Здравствуйте, fryky, Вы писали:

F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.

Здравствуйте, Zerger, Вы писали:

 /* исправления нужны для IE до версии 5.5 */ Z>if( ObjectName.MethodName + "" != "undefined" )< // ObjectName.MethodName - без скобок Z> . Z>> /* Более общий подход, проверяет всё вплоть до свойств */ if(Object["MemberName"] + "" != "undefined") < /* свойства/метода c именем MemberName не существует */ > Z>

А вообще правильно, для 1.5 яваскрипта правильным будет сравнение с сущностью undefined, а не строкой.

Здравствуйте, fryky, Вы писали:

FF>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.

Стандартный способ — оператор in:

var fso = new ActiveXObject(«Scripting.FileSystemObject»);’какой-нибудь объект
‘проверяем существование метода CreateFolder ():
var exists = «CreateFolder» in fso; ‘получаем значение true или false
window.alert («есть это:» + exists);

Только in не отличает метод от свойства (не получается «GetFolder()» in fso) и объект в выражении с in должен уже существовать (иначе возникнет исключение).

Здравствуйте, Partisan, Вы писали:

P>Стандартный способ — оператор in:

P>var fso = new ActiveXObject(«Scripting.FileSystemObject»);’какой-нибудь объект
P>’проверяем существование метода CreateFolder ():
P>var exists = «CreateFolder» in fso; ‘получаем значение true или false
P>window.alert («есть это:» + exists);

P>Только in не отличает метод от свойства (не получается «GetFolder()» in fso) и объект в выражении с in должен уже существовать (иначе возникнет исключение).

Опа, совсем про него забыл. Одно уточнение, этот оператор появился в Javascript 1.4 и в JScript 1.0 и по-моему его нет в стандарте ECMA, то есть в ECMAScript это точно работать не станет.
И из не IE его поддерживают только последние версии браузеров.

Источник

Оцените статью