Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   аналог __autoload в JS (https://javascript.ru/forum/misc/13687-analog-__autoload-v-js.html)

Tim 09.12.2010 13:05

аналог __autoload в JS
 
В PHP есть такая функция "__autoload", которая вызывается в момент когда интерпретатор не может найти определене какого либо класса. Можно ли придумать что нибудь подобое на JS? Можно ли как то перехватить ошибку отсутствия определения функции? Может window.onerror подойдёт? Как тогда определить имя функции?

И ещё вопросик: когда в контенте загружаемом с помощью AJAX встречается сслка на JS файл, то функции из этого файла становятся доступны. При этом если в этом же контенте есть скрипт вида:

<script type="text/javascript">

onload = function() {

}

</script>


то бработчик onload не срабатывает.

Kolyaj 09.12.2010 13:15

Цитата:

Сообщение от Tim
В PHP есть такая функция "__autoload", которая вызывается в момент когда интерпретатор не может найти определене какого либо класса. Можно ли придумать что нибудь подобое на JS? Можно ли как то перехватить ошибку отсутствия определения функции? Может window.onerror подойдёт? Как тогда определить имя функции?

Это просто идеологически невозможно.


Цитата:

Сообщение от Tim
то бработчик onload не срабатывает.

Потому что onload на странице уже случился.

Tim 09.12.2010 14:58

СПС!

dmitriymar 09.12.2010 22:20

можно перехватить отсутствие функции-уже писал об этом.но повторюсь. допустим присвоить какойто переменной маркеру какое либо значение.в функции сделать изменение этого значения. если значение изменилось то функция есть. если не изменилось значит она отсутствует

Tim 10.12.2010 06:54

dmitriymar,
Спасибо за ответ, но думаю что мне это не подойдёт. Мне нужно делать это не с одной функцией а с несколькими, при этом у них куча всяких разных параметров. В общем говнокода в этом случае будет не избежать, я и так уже понаворочал много там.

dmitriymar 10.12.2010 09:56

я делал чуть не так-делал подгрузку скрипта-где было несколько функций и проверял наличие одной если она была то и все относящиеся к скрипту тож соответсвено были

x-yuri 11.12.2010 21:28

Цитата:

Сообщение от Kolyaj
Это просто идеологически невозможно.

а что значит идеологически невозможно?

PeaceCoder 14.12.2010 13:22

Цитата:

Сообщение от x-yuri
а что значит идеологически невозможно?

а то что в JS нет такого собития и умышленно его не предугадать. Это тоже самое если бы в JS можно было перехватывать обычные ошибки не прерывая ход работы скриптов.

Kolyaj 14.12.2010 13:28

Цитата:

Сообщение от x-yuri
а что значит идеологически невозможно?

Цитата:

Сообщение от PeaceCoder
а то что в JS нет такого собития и умышленно его не предугадать.

Идеологически, это скорее, для JS скачать файл с сервер совсем не то же самое, что для PHP прочитать файл с диска.

x-yuri 14.12.2010 13:32

может, скорее, то, что js не рассчитан на выполнение в какой-то конкретной среде и даже если бы он ее обязывал предоставлять для этого какие-то интерфейсы, то в каком виде бы он указывал, где искать класс?

Kolyaj 14.12.2010 13:42

Основная тут проблема в том, что JS не предоставляет возможности указать функцию, которая бы вызывалась при отсутствии у объекта свойства, к которому обращаются (а-ля __set/__get в PHP).

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

PeaceCoder 14.12.2010 13:54

Цитата:

Сообщение от Kolyaj
данную возможность добавить в него не так легко.

ну по чему же ? вроде легко. Просто если нет функции в вызываемом обьекте - вызывать __autoload в этом обьекте. если его нет - то вызывать __autoload выше по структуре обьекта и так до window. а в передаваемых параметрах: this = то где был найден __autoload и 4 входящих - обьект вызова функции, имя функции, thisobj в вызываемой ф-ции, и массив параметров в нее. При возврате true - не генерировать ошибку. false - искать выше __autoload

Но на деле в коде видимо не легко такое встроить.

за вызов функции в самой функции. Тут надо по другому делать логику: вызывать __autoload тут надо думаю не имеет смысла а генерировать вызов window.__autoload.call(window, function, fnName, thisOnCall, []);

П.С. Введя хотя бы __call, __set, __get, __autoload в JS - в корень поменялся бы код любой CMS

Kolyaj 14.12.2010 14:08

Забудем пока про __autoload, он упирается в другую проблему, в сеть.

Цитата:

Сообщение от PeaceCoder
Просто если нет функции в вызываемом обьекте - вызывать __autoload в этом обьекте. если его нет - то вызывать __autoload выше по структуре обьекта и так до window.

Это будет противоречить другому механизму: поиску свойства в цепочке прототипов.

PeaceCoder 14.12.2010 14:16

Цитата:

Сообщение от Kolyaj
Это будет противоречить другому механизму: поиску свойства в цепочке прототипов.

Не так выразился. Это я и имел ввиду. Если уже в прототипах нет, то искать __autoload в них. В основном я так думаю как раз таки в прототип обьекта и надо ставить __autoload, что бы он был 1 на все подсвойства обьекта.

Цитата:

Сообщение от Kolyaj
Забудем пока про __autoload, он упирается в другую проблему, в сеть.

Если так рассуждать то зачем автолоад? А раз он нужен значит с сетью у разработчика уже все продумано.

x-yuri 14.12.2010 14:27

Цитата:

Сообщение от Kolyaj
Забудем пока про __autoload, он упирается в другую проблему, в сеть.

не упирается, ты ж сам ему будешь указывать, какой нужен файл. Правда опять же, сети может не быть

Цитата:

Сообщение от Kolyaj
Это будет противоречить другому механизму: поиску свойства в цепочке прототипов.

а это да, может даже идеологическая причина :)

Kolyaj 14.12.2010 15:08

Цитата:

Сообщение от PeaceCoder
Если так рассуждать то зачем автолоад?

Я как раз говорю, что он не нужен :)
Я рассуждаю о другой проблеме, без решения которой autoload невозможен.

DooMer 15.12.2010 15:26

function test(){
	test_func();
}
try{
	test();
}catch(e){
 if(new String(e).indexOf('is not a function')!=-1){
	//тут парсим строку е и находим имя функции что б подгрузить нужный файл
	var headID = document.getElementsByTagName("head")[0];         
	var addScript = document.createElement('script');
	addScript.type = 'text/javascript';
	addScript.src = '../your_func.js';
	headID.appendChild(addScript);
	test();
 }
}

решение для песочницы, не более

VKS 15.12.2010 16:03

А почему б не использовать решение аля jit? http://www.felocity.org/blog/article...or_javascript/


Часовой пояс GMT +3, время: 03:06.