|
Улучшить код
Привет. Код: http://jsfiddle.net/nz2c2cva/1/
надо переписать строку проверки условия, комментарий специалиста: "В конструкторе проверять this, если this не твой инстанс, то вызывать заново конструктор внутри себя уже с new", причём это решение должно быть лучше if (this.$) { return new $(selector); } Написал так: if (this instanceof window.constructor) , но специалист не принял, сказав, что ничего не улучшилось Так же, скажите, почему такой вариант лучше |
if (!(this instanceof $)) { return new $(selector); } зачем учиться так, чтоб за тебя решали? |
не уверен, что правильно понял, но, похоже, ты хотел вот так сделать
<html> <head> <meta charset="windows-1251" /> </head> <body> <div class="class0"> <a href="">link</a> </div> <div class="class0"></div> <div class="class0"></div> <script> var $ = function (selector){ var o=Object.create($.prototype) o.tags = document.querySelectorAll(selector); return o } $.prototype.addClass = function(className){ for (var i = 0; i < this.tags.length; i++){ this.tags[i].classList.add(className); } return this; } $.prototype.copyHtml = function(){ var html=this.tags[0].innerHTML for(var i = 1; i < this.tags.length; i++){ this.tags[i].innerHTML=html } } $('div').addClass('class2').copyHtml(); </script> </body> </html> |
И вот так,
var $ = function (selector){ this.tags = document.querySelectorAll(selector); никогда не делай. Если уж используешь эту клоунаду, сначала рекурсивный вызов через new, а уже потом присваивание. Например, $=function(selector){ if (!(this instanceof $)) return new $(selector); this.tags = document.querySelectorAll(selector); ... а в твоем случае, this===window, соответственно, ты туда срешь. |
А вообще, эту хрень проще безо всякого prototype написать, он тут ни к чему, по-моему
<html> <head> <meta charset="windows-1251" /> </head> <body> <div class="class0"> <a href="">link</a> </div> <div class="class0"></div> <div class="class0"></div> <script> var $ = function (selector){ var o=Object.create($) o.tags = document.querySelectorAll(selector); return o } $.addClass = function(className){ for (var i = 0; i < this.tags.length; i++){ this.tags[i].classList.add(className); } return this; } $.copyHtml = function(){ var html=this.tags[0].innerHTML for(var i = 1; i < this.tags.length; i++){ this.tags[i].innerHTML=html } } $('div').addClass('class2').copyHtml(); </script> </body> </html> но все зависит от юзкейса, конечно. |
Цитата:
Спасибо, а почему так лучше? |
Цитата:
Код не надо изменять, это задание, которое почти выполнено |
Цитата:
|
Я понимаю, что такое конструктор и new.
Тем не менее, объясните, почему проверка if (!(this instanceof $))лучше, чем if (this.$) Кроме того, даже используя отладчик не пойму как работает этот код: $.prototype.html = function(){ var clone = new $('_'); clone.tags = this.tags; clone.toString = function() { console.log("|"); return this.tags[0].innerHTML; }; console.log("||"); return clone; } Точнее - в каком порядке исполняются инструкции return. Как я понял сначала отрабатывает return clone, затем функция toString()? Отладчик не заходит в toString |
Цитата:
Цитата:
а еще не понятно, зачем такое извращение $.prototype.html = function(){ var clone = new $('_'); clone.tags = this.tags; clone.toString = function() { return this.tags[0].innerHTML; }; return clone; } если достаточно // getter $.prototype.html = function(){ return this.tags[0].innerHTML; } http://api.jquery.com/html/ http://code.jquery.com/jquery-2.1.1.js |
Часовой пояс GMT +3, время: 09:54. |
|