powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JS: Как проверить наличие метода в объектах FileReader и FormData ?
13 сообщений из 13, страница 1 из 1
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39477301
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для примера, проверить наличие метода " URL.createObjectURL " можно 3 способами:
Код: javascript
1.
2.
3.
!!URL.createObjectURL
'createObjectURL' in URL
URL.hasOwnProperty('createObjectURL')


Но с объектами FileReader и FormData беда какая-то. Ни один из способов не работает.
Например, нужно проверить наличие методов (которые гарантированно поддерживаются всеми современными браузерами):
Код: javascript
1.
2.
FileReader.readAsDataURL
FormData.append


Как проверить ?
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39477303
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

проверить практически все что угодно можно с помощью метода обработки ошибок try-catch
https://www.w3schools.com/js/js_errors.asp
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39477377
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпроверить практически все что угодно можно с помощью метода обработки ошибок try-catchДля того, чтобы можно было проверить существование метода с помощью try...catch , нужно:
а) подготовить тестовые (но реальные) данные для выполнения проверяемого метода (получить объект File , содержащий ссылку на реальный файл, либо создать объект FormData )
б) выполнить реальную команду путём вызова метода и передачи ему реальных данных
в) различать типы ошибок, поскольку в процессе выполнения реальной команды могут быть сгенерированы ошибки, не связанные с НЕсуществованием метода

В итоге все эти действия превращаются ни во что иное, как в "тяжёлую" заплатку, которую вряд ли кто реализовывает с целью решения сабжевой задачи...
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39478043
Фотография Тshаmil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Для примера, проверить наличие метода " URL.createObjectURL " можно 3 способами:
Код: javascript
1.
2.
3.
!!URL.createObjectURL
'createObjectURL' in URL
URL.hasOwnProperty('createObjectURL')


Но с объектами FileReader и FormData беда какая-то. Ни один из способов не работает.
Например, нужно проверить наличие методов (которые гарантированно поддерживаются всеми современными браузерами):
Код: javascript
1.
2.
FileReader.readAsDataURL
FormData.append


Как проверить ?

например так:
Код: javascript
1.
2.
3.
4.
5.
6.
if (typeof new FileReader().readAsDataURL == 'function') {
  ....
}
if (typeof new FormData().append == 'function') {
  ....
}
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39478087
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно не создавать объекты
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if((typeof FileReader !== 'undefined') && FileReader.prototype.readAsDataURL){
    console.log('FileReader.readAsDataURL is exists');
}else{
  console.log('FileReader.readAsDataURL is not exists');
}
if((typeof FormData !== 'undefined') && FormData.prototype.append){
  console.log('FormData.append is exists');
}else{
  console.log('FormData.append is not exists');
}
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39478405
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, тоже подумал про прототипы. Через прототипы работает нормально .

В случае с URL проверку необходимо выполнять через объект URL , а не через его прототип (прототип имеет тип URLPrototype ), поскольку методы URL.createObjectURL() и URL.revokeObjectURL() прописаны в самом объекте URL , а в его прототипе отсутствуют:
Код: javascript
1.
2.
URL.createObjectURL = function
URL.prototype.createObjectURL = undefined


Но в случае с объектами FileReader и FormData - наоборот. Проверяемые методы присутствуют в их прототипах, но отсутствуют в самих объектах (не являются их собственными свойствами):
Код: javascript
1.
2.
FileReader.prototype.readAsObjectURL = function
FormData.prototype.append = function


Но здесь непонятно, почему обращение к этим методам непосредственно через сами объекты возвращает unfdefined , ведь при обращении к свойствам и методам объекта при отсутствии собственных методов должно производиться обращение к методам прототипов.
Код: javascript
1.
2.
FileReader.readAsObjectURL = undefined
FormData.append = undefined
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39478488
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02, дык надо объект создать через new, чтобы в его прототип __proto__ записалась ссылка из prototype.
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39478548
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дополню, skyANA

У тебя путаница в понятиях между этим
"The Window.URL property returns an object that provides static methods " цитата из MDN
грубо говоря никакого new не надо

Код: javascript
1.
2.
3.
4.
5.
window.URL={
 ...
 createObjectURL: function...
 ...
}



и этим

Код: javascript
1.
2.
3.
4.
5.
6.
function FileReader(){
 ...
}
FileReader.prototype.readAsDataURL = function...

window.FileReader = FileReader;


инстанс которого создаётся через конструктор с помощью new
а ты пытаешься сделать

if(window.FileReader.readAsDataURL) - естественно что это лажа

если есть желание разобраться, то очень советую прочитать, то что мне очень помогло для понимания, цикл статей
http://dmitrysoshnikov.com/ecmascript/ru-javascript-the-core/
тем более что есть на русском
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39479063
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо в случае с объектами FileReader и FormData - наоборот. Проверяемые методы присутствуют в их прототипах, но отсутствуют в самих объектах (не являются их собственными свойствами)Да, здесь нужно поправиться: не " отсутствуют в самих объектах ", а " отсутствуют в функциях-конструкторах этих объектов " (а в самих объектах - присутствуют).

Т.е. в случае с windows.URL.createObjectURL выполняется обращение к "статическому" свойству-функции " createObjectURL " функции-конструктора " windows.URL ".

И поскольку FileReader и FormData являются функциями-конструкторами без статических методов, а методы " readAsDataURL() " и " append() " - это свойства-функции объектов-прототипов FileReaderPrototype и FormDataPrototype соответственно, то проверить наличие эти методов можно двумя способами:

1. Через прототип функций-конструкторов FileReader и FormData :
Код: javascript
1.
2.
'readAsDataURL' in FileReader.prototype
'append' in FormData.prototype

2. Через прототип объектов "классов" FileReader и FormData (объектов, созданных функциями-конструкторами FileReader и FormData ):
Код: javascript
1.
2.
'readAsDataURL' in (new FileReader).__proto__
'append' in (new FormData).__proto__


Поскольку свойство "__proto__" стандартизовано только в ECMAScript 6 , плюс создание объектов - это лишняя трата ресурсов, то предпочтителен вариант №1 .
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39479419
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02а в самих объектах - присутствуют
Нет. Они определены в прототипе, ссылка на который копируется в __proto__ при создании объекта через new.

И второй вариант - это уж перебор. Не вижу смысла обращаться напрямую к __proto__ после создания объекта, если уже можно обратиться напрямую к проверяемому методу.

Тогда уж вариантом номер два должен быть тот, что выше предложил Тshаmil: 20592353 .
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39479803
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote автор]skyANACyrax_02а в самих объектах - присутствуют
Нет. Они определены в прототипе, ссылка на который копируется в __proto__ при создании объекта через new.Строго говоря, да. Но под " в самих объектах - присутствуют " я имел ввиду видимость этих методов непосредственно из объектов
А объявлены (и физически существуют/присутствуют) они, конечно, в прототипах.

авторТогда уж вариантом номер два должен быть тот, что выше предложил Тshаmil: 20592353. Его вариант - это вообще без явного обращения к прототипам. Мои два варианта - с явным обращением к прототипу.

Кстати мой 2-й вариант может иметь смысл (как альтернатива 1-му) в том случае, когда объект уже создан (для неких иных целей).
При этом конструкция с " in " семантически более понятна и прозрачна, чем определение типа свойства-функции " typeof ... readAsDataURL ".
Но имеет минусы (свойство " __proto__ " стандартизовано только в ECMAScript 6 )
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39479841
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02, а можете толком объяснить, зачем нужно явное обращение к __proto__ во втором случае?

Код: javascript
1.
2.
let reader = new FileReader();
console.log('readAsDataURL' in reader);


У меня на в консоли true , а у Вас?
...
Рейтинг: 0 / 0
JS: Как проверить наличие метода в объектах FileReader и FormData ?
    #39479950
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANACyrax_02, а можете толком объяснить, зачем нужно явное обращение к __proto__ во втором случае?
Код: javascript
1.
2.
let reader = new FileReader();
console.log('readAsDataURL' in reader);

У меня на в консоли true , а у Вас?Согласен. К __proto__ обращаться вообще не нужно ))

Т.е. имеем 2 варианта:
Код: javascript
1.
2.
'readAsDataURL' in FileReader.prototype
'readAsDataURL' in (new FileReader)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JS: Как проверить наличие метода в объектах FileReader и FormData ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]