Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2014, 22:36
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 30.11.2014, 22:50
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

if (!(this instanceof $)) {
    return new $(selector);
}

зачем учиться так, чтоб за тебя решали?
Ответить с цитированием
  #3 (permalink)  
Старый 30.11.2014, 23:49
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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>
Ответить с цитированием
  #4 (permalink)  
Старый 01.12.2014, 00:00
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 01.12.2014, 00:18
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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>

но все зависит от юзкейса, конечно.
Ответить с цитированием
  #6 (permalink)  
Старый 01.12.2014, 07:08
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Сообщение от Poznakomlus Посмотреть сообщение
if (!(this instanceof $)) {
    return new $(selector);
}

зачем учиться так, чтоб за тебя решали?
Я абсолютно не знаю как это делать, поэтому и спрашиваю

Спасибо, а почему так лучше?

Последний раз редактировалось OlegALL, 01.12.2014 в 07:14.
Ответить с цитированием
  #7 (permalink)  
Старый 01.12.2014, 07:10
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 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>

но все зависит от юзкейса, конечно.

Код не надо изменять, это задание, которое почти выполнено
Ответить с цитированием
  #8 (permalink)  
Старый 01.12.2014, 07:35
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от OlegALL
Я абсолютно не знаю как это делать, поэтому и спрашиваю
Ды должен был спросить не как это сделать, а почему твой вариант неправильный. А перед этим разобраться и пояснить нам что такое конструктор, и как работает оператор new. Если бы разобрался, то понял сам чего от тебя хотят и реализовал бы.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 01.12.2014, 09:02
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 01.12.2014, 10:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код Kendrick Internet Explorer 5 12.09.2012 16:14
Требуется выводить код рекламного блока Adsense из файла JavaScript??? speedflow Элементы интерфейса 0 26.05.2012 15:50
Запуск кода с фрейма, код в родительском окне - КАК ? lamer Javascript под браузер 7 06.05.2012 15:15
Как создать bodyclick код royksopp Общие вопросы Javascript 8 14.10.2011 16:39
код странно отрабатывает комбинацию клавиш ffx Общие вопросы Javascript 4 20.01.2011 10:58