Цитата:
Энивей, он в глобале var не использует, что привносит неочевидности - создается впечатление, что эта переменная уже была где-то объявленна (не говоря уже о том, что не во всех имплементациях внешний код в выполняется в глобале). Цитата:
|
Цитата:
|
Erolast,
И, кстати, насчет твоего предыдущего высера по поводу явного/неявного. Если я изнутри функции меняю глобальную переменную, которая еще не объявлена, это не значит, идиот, что это делается неявно. На самом деле, я меняю перемнную со значением undefined на переменную со значением some_value, семантически. Неявно -- это когда ты не понимаешь, что ты делаешь, примерно как ты. Если ты по тупости своей, непреднамеренно изменил переменную в глобале, или создал, вот это есть неявно. В остальных случаях -- все явно, идиот. local={} ;(function(){this.x=1}).apply(window) ;(function(){this.x=1}).apply(local) alert([window.x, local.x]) Задумайся, ущерб, почему бы тебе не объявлять в local переменные через вар, lol. Это тебе, блять, не паскаль, здесь семантика massage passing. Вот из=-за таких уродов как ты, отрыжек дейксры, нормальный язык изуродовали до неузнаваемости. |
Продолжаем решение поиска ответа:
Нужно, чтобы цепочка не разрывалась Код: var $ = function (selector){ this.tags = document.querySelectorAll(selector); if (this.$) { return new $(selector); } } $.prototype.addClass = function(className){ for (var i = 0; i < this.tags.length; i++){ this.tags[i].classList.add(className); } return this; } $.prototype.html = function(){ return this.tags[0].innerHTML; } console.log($('div').addClass('class1').html().addClass('class2')); // нужно, чтобы работало комментарий от специалиста, который поставил задачу: "Надо переопределить toString у this внутри методов. Теперь если результат ты используешь как строку, она у тебя и будет строкой, хотя возвращать ты будешь this" Попробовал, не работает. И вообще, не знаю как это сделать. Даже не совсем понял комментарий. Помогите |
Да с чего ты вообще взял, что это должно работать? html возвращает данные, он прерывает текучий интерфейс и ставится последним в цепочке вызовов. Какова, по-твоему, его функция при расположении в середине? Красоты ради?
|
Ну тогда надо не this возвращать, а новый объект. Иначе такой код не будет работать:
var $div = $('div'); var html = $div.html(); // меняет toString на выдачу html var text = $div.text(); // меняет toString на выдачу text alert(html); // выдаст text вместо html Но тогда html !== $div, но по-другому и быть не может, иначе возникает противоречие. |
Да это просто не нужно. html в любом случае будет в конце цепочки распологаться, иначе он не вернет данные == не нужен.
|
Кстати, html возвращает клон, и он тащится далее по цепочке. Таким образом $().html().addClass().toString() вернет html, а не [object Object]
Значит, нужно в каждом методе создавать клон. Короче, херня получается. <div>This is <b>content</b></div> <script> var $ = function (selector){ this.tags = document.querySelectorAll(selector); if (this.$) { return new $(selector); } } $.prototype.addClass = function(className){ for (var i = 0; i < this.tags.length; i++){ this.tags[i].classList.add(className); } return this; } $.prototype.html = function(){ var clone = new $('_'); clone.tags = this.tags; clone.toString = function() { return this.tags[0].innerHTML; }; return clone; } var $div = $('div').addClass('class1').html().addClass('class2'); console.log($div); // нужно, чтобы работало alert($div.html()); </script> |
Спасибо!
Сейчас 3 вопроса: 1. так: alert($('div').addClass('class1').html().addClass( 'class2').html()); - всё гуд а так: console.log($('div').addClass('class1').html().add Class('class2').html()); - выводит this ($ {tags: NodeList[3], toString: function, addClass: function, html: function}) почему? 2. Объясните смысл if (this.$) { return new $(selector); } Здесь нужно переделать. Комментарий специалиста: "if (this.$) - плохое решение. Лучше проверять instanceof." Мне пока непонятно 3. почему в клоне нет проверки if (this.$) { return new $(selector); } И можно ли сделать наследование от $? или фактически оно и есть? UPD. Текущий код: var $ = function (selector){ this.tags = document.querySelectorAll(selector); if (this instanceof window.constructor) { return new $(selector); } } $.prototype.addClass = function(className){ for (var i = 0; i < this.tags.length; i++){ this.tags[i].classList.add(className); } return this; } $.prototype.html = function(){ var clone = new $('_'); clone.tags = this.tags; clone.toString = function() { return this.tags[0].innerHTML; }; return clone; } Правильно ли сделано это: if (this instanceof window.constructor) { return new $(selector); } |
Часовой пояс GMT +3, время: 14:48. |