Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 12.11.2014, 10:18
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Erolast, на конец предыдущей строки посмотри.
А. Ну так надо нормально форматировать.
Энивей, он в глобале var не использует, что привносит неочевидности - создается впечатление, что эта переменная уже была где-то объявленна (не говоря уже о том, что не во всех имплементациях внешний код в выполняется в глобале).
Цитата:
html() с одной стороны должен возвращать this[0].innerHTML, а с другой this. Как это объединить не знаю.
Никак. html должен возвращать this[0].innerHTML - здесь текучий интерфейс прерывается.
Ответить с цитированием
  #22 (permalink)  
Старый 12.11.2014, 11:12
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Erolast
не говоря уже о том, что не во всех имплементациях внешний код в выполняется в глобале
Оппа, да ты виднейший представитель CS. У тебя своя теория выполнения кода. Ну поясни тогда, что такое "внешний код" и "выполнение в глобале", раз уж кукарекнул. Это, наверное, когда в компьютере сидит какой-то дядя, получает инструкции, переносит их в "глобал", а потом выполняет, да, сладенький? А в некоторых имплементациях, он говорит: "фи, я буду выполнять код в локале, или в Анале". Ты знаком с термином "область видимости переменных"? Вот если хочешь какого-то конструктива, пляши от этого в своих высерах. Похоже, цирк маст гоу он.
Ответить с цитированием
  #23 (permalink)  
Старый 12.11.2014, 11:25
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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. Вот из=-за таких уродов как ты, отрыжек дейксры, нормальный язык изуродовали до неузнаваемости.

Последний раз редактировалось krutoy, 12.11.2014 в 11:43.
Ответить с цитированием
  #24 (permalink)  
Старый 27.11.2014, 11:39
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Продолжаем решение поиска ответа:
Нужно, чтобы цепочка не разрывалась

Код:

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"

Попробовал, не работает. И вообще, не знаю как это сделать. Даже не совсем понял комментарий. Помогите
Ответить с цитированием
  #25 (permalink)  
Старый 27.11.2014, 12:00
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Да с чего ты вообще взял, что это должно работать? html возвращает данные, он прерывает текучий интерфейс и ставится последним в цепочке вызовов. Какова, по-твоему, его функция при расположении в середине? Красоты ради?
Ответить с цитированием
  #26 (permalink)  
Старый 27.11.2014, 12:01
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Ну тогда надо не this возвращать, а новый объект. Иначе такой код не будет работать:
var  $div = $('div');

var html = $div.html(); // меняет toString на выдачу html

var text = $div.text(); // меняет toString на выдачу text

alert(html); // выдаст text вместо html



Но тогда html !== $div, но по-другому и быть не может, иначе возникает противоречие.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #27 (permalink)  
Старый 27.11.2014, 12:10
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Да это просто не нужно. html в любом случае будет в конце цепочки распологаться, иначе он не вернет данные == не нужен.
Ответить с цитированием
  #28 (permalink)  
Старый 27.11.2014, 12:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, 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>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #29 (permalink)  
Старый 27.11.2014, 14:48
Аспирант
Отправить личное сообщение для OlegALL Посмотреть профиль Найти все сообщения от OlegALL
 
Регистрация: 23.01.2010
Сообщений: 90

Спасибо!
Сейчас 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);
}

Последний раз редактировалось OlegALL, 27.11.2014 в 20:19.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический подсчет в таблице muraig jQuery 5 11.10.2014 16:54
хочу инвайт на хабр macdack Оффтопик 45 28.07.2013 23:18
Вопрос поддержки старых методов jQuery antonM jQuery 1 04.10.2012 00:08
Цепочка вызовов с таймаутом. Jurasmi Общие вопросы Javascript 18 25.01.2011 17:18
JQuery + FireFox NOOB jQuery 4 02.11.2009 18:16