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

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, время: 23:02.