Правильный контекст this и наследование с помощью prototype
Всем привет!
Решил разобраться с наследованием с помощью prototype и сразу применить на практике. Через некоторое время столкнулся с проблемой следующего характера. Разметка: <ul id="tree"> <li><i></i><a href="menu-add.html">Добавление меню</a></li> <li> <i></i><a href="phrases.html">Фразы</a> <ul><li><i></i><a href="phrases-edit.html">Редактирование</a></li></ul> </li> ... </ul> <script type="text/javascript"> new Tree("menu"); </script> Скрипт: function Tree(Element) { if(typeof Element === "string") Element = document.getElementById(Element); Element.onclick = this.Click; } Tree.prototype.Click = function(E) { E = E || window.event; var Target = E.target || E.srcElement; if(Target.tagName === "I") здесь нужно вызвать метод Toggle else if(Target.tagName === "A") return false; } Tree.prototype.Toggle = function(Element) { Element.parentNode.className = Element.parentNode.className === "show" ? "" : "show"; } В связи с тем что метод Click вызван в контексте елемента страницы то, this указывает на него, а мне нужно вызвать метод Toggle объекта Tree. Как это правильнее всего сделать? |
Добавить -
var that = this; Element.onclick = that.Click; в конструктор Tree. |
В конструктор Tree:
var that = this; Element.onclick = function(e) { that.Click.call( that, e ) }; в Click: if(Target.tagName === "I") this.Toggle(); //здесь нужно вызвать метод Toggle |
Element.onclick = this.Click.bind(this); Но это не сработает в старых браузерах (IE6-8 как минимум). Так что изврат: var Tree = this; Element.onclick = function(){ tree.Click.apply(tree, arguments); } Кстати кто вас научил писать все имена переменных с большой буквы? Это тупость полнейшая. Ничего не понятно - где конструктор, где че. Пример выше - Tree - это инстанс или конструктор? Это инстанс, но из-за дебильного именования совпал по имени с конструктором. Да и со встроенными объектами диссонанс получается. |
VBScript же. =\
Пускай пишет как нравится, если переучиваться лень. Но и пускай знает, что если пойдёт в команду - перекручиваться заставят, перед этим вусмерть затроллив.) |
Часовой пояс GMT +3, время: 06:41. |