
30.11.2014, 22:36
|
Аспирант
|
|
Регистрация: 23.01.2010
Сообщений: 90
|
|
Улучшить код
Привет. Код: http://jsfiddle.net/nz2c2cva/1/
надо переписать строку проверки условия,
комментарий специалиста:
"В конструкторе проверять this, если this не твой инстанс,
то вызывать заново конструктор внутри себя уже с new",
причём это решение должно быть лучше
if (this.$) {
return new $(selector);
}
Написал так: if (this instanceof window.constructor) , но специалист не принял, сказав, что ничего не улучшилось
Так же, скажите, почему такой вариант лучше
Последний раз редактировалось OlegALL, 01.12.2014 в 07:14.
|
|

30.11.2014, 22:50
|
 |
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
if (!(this instanceof $)) {
return new $(selector);
}
зачем учиться так, чтоб за тебя решали?
|
|

30.11.2014, 23:49
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
не уверен, что правильно понял, но, похоже, ты хотел вот так сделать
<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>
|
|

01.12.2014, 00:00
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
И вот так,
var $ = function (selector){
this.tags = document.querySelectorAll(selector);
никогда не делай.
Если уж используешь эту клоунаду, сначала рекурсивный вызов через new, а уже потом присваивание. Например,
$=function(selector){
if (!(this instanceof $)) return new $(selector);
this.tags = document.querySelectorAll(selector);
...
а в твоем случае, this===window, соответственно, ты туда срешь.
Последний раз редактировалось krutoy, 01.12.2014 в 00:02.
|
|

01.12.2014, 00:18
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
А вообще, эту хрень проще безо всякого 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>
но все зависит от юзкейса, конечно.
|
|

01.12.2014, 07:08
|
Аспирант
|
|
Регистрация: 23.01.2010
Сообщений: 90
|
|
Сообщение от Poznakomlus
|
if (!(this instanceof $)) {
return new $(selector);
}
зачем учиться так, чтоб за тебя решали?
|
Я абсолютно не знаю как это делать, поэтому и спрашиваю
Спасибо, а почему так лучше?
Последний раз редактировалось OlegALL, 01.12.2014 в 07:14.
|
|

01.12.2014, 07:10
|
Аспирант
|
|
Регистрация: 23.01.2010
Сообщений: 90
|
|
Сообщение от krutoy
|
А вообще, эту хрень проще безо всякого 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>
но все зависит от юзкейса, конечно.
|
Код не надо изменять, это задание, которое почти выполнено
|
|

01.12.2014, 07:35
|
 |
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от OlegALL
|
Я абсолютно не знаю как это делать, поэтому и спрашиваю
|
Ды должен был спросить не как это сделать, а почему твой вариант неправильный. А перед этим разобраться и пояснить нам что такое конструктор, и как работает оператор new. Если бы разобрался, то понял сам чего от тебя хотят и реализовал бы.
__________________
В личку только с интересными предложениями
|
|

01.12.2014, 09:02
|
Аспирант
|
|
Регистрация: 23.01.2010
Сообщений: 90
|
|
Я понимаю, что такое конструктор и 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
Последний раз редактировалось OlegALL, 01.12.2014 в 10:23.
|
|

01.12.2014, 10:35
|
 |
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от OlegALL
|
но специалист не принял
|
безобразие
Сообщение от OlegALL
|
Я понимаю, что такое конструктор и new
|
если бы понимал, не писал бы такой ерунды
а еще не понятно, зачем такое извращение
$.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
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 01.12.2014 в 10:41.
|
|
|
|