Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Доступ к аргументам Функции со стороны её Методов (https://javascript.ru/forum/misc/66980-dostup-k-argumentam-funkcii-so-storony-ejo-metodov.html)

Teamur 21.01.2017 12:25

Доступ к аргументам Функции со стороны её Методов
 
Метод .on() функции Main() не может получить доступ к item, переданному в неё. Знаю, что в jQuery есть функция $, в которую передается аргумент, с которым затем работают методы. Открыв исходник jQuery и увидев код, мне захотелось закрыть его, что я и сделал. Вот решил обратиться к Вам на форум!

<!doctype html>

<div>
  <div id='square'></div>
</div>

<style>
  #square {
    width: 100px;
    height: 100px;
    background-color: #ea8181;
  }
</style>

<script>
  function Main(item) {
    if (typeof item == 'string') {
      alert('Item is not element');
      return;
    }
    this.elem = item;
  }

  Main.prototype.on = function(event, handler) {
    this.elem.addEventListener(event, handler);
  }

  function show(e) {
    alert(e.target);
  }

  Main(square).on('click',show);
</script>


Покажите, пожалуйста, как правильно делаются подобные вещи?
Спасибо!

destus 21.01.2017 13:17

Teamur,
new Main(square).on('click',show);

или
function Main(item) {
	if (!(this instanceof Main)){
		return new Main(item);
	}
    if (typeof item == 'string') {
      alert('Item is not element');
      return;
    }
    this.elem = item;
  }

Teamur 21.01.2017 15:02

destus,
А в jQuery тоже это делается через new?

Хотелось бы без new ).

Одна главная функция и куча методов к ней!

Как еще можно реализовать! Предложите, пожалуйста, еще варианты!

Вопрос совместимости со старыми браузерами не стоит, поэтому если это как-то можно укоротить, используя es6, 7, 8 и тд, я только ЗА!

И еще подвопрос: А можно нпр, чтобы главная функцию вернула объект с методами?

Rise 21.01.2017 15:17

Цитата:

Сообщение от Teamur (Сообщение 441757)
А в jQuery тоже это делается через new?

Да, и делается как здесь.
Цитата:

Сообщение от Teamur (Сообщение 441757)
А можно нпр, чтобы главная функцию вернула объект с методами?

Там и есть объект с методами, которые в прототипе, который общий у всех этих объектов, что экономит память.

destus 21.01.2017 15:26

Цитата:

А в jQuery тоже это делается через new?
Если ты заменишь ф-цию Main из 2 поста, new можно не писать при вызове. Вот тебе как в jQuery https://github.com/jquery/jquery/blo.../event.js#L517

Rise 21.01.2017 15:45

Teamur, и jQuery на es5 написано.

Teamur 21.01.2017 15:56

destus,
Rise,
Спасибо, товарищи!
Я как обычно пооткрывал 50 вкладок и утонул в каше!
Если ещё как-то можно улучшить) код, буду рад ответам!

Teamur 21.01.2017 16:15

А можно как-то обойтись без постоянной записи this.elem this.elem this.elem?

Rise 21.01.2017 16:36

Teamur, зачем?

Teamur 21.01.2017 16:44

Компактизация, минификация...


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