Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Помогите разобраться. (https://javascript.ru/forum/dom-window/36459-pomogite-razobratsya.html)

potato 15.03.2013 16:44

Помогите разобраться.
 
Доброго времени суток.

Читаю книгу "Джон Рейсиг JavaScript Профессиональные приёмы программирования".
Не понял пример из книги. А именно строку с объектом name. Нужна ваша помощь.

Пример:

function attr(elem, name, value) { 
// Гарантирование допустимости предоставленного имени
	if ( !name || name.constructor != String ) return ''; 
// Определение, не относится ли это имя к тем самым«роковым» 
// именам
	name = { 'for': 'htmlFor', 'class': 'className' }[name] || name; /* Не понял вот эту строку. Что здесь происходит? */
// Если пользователь устанавливает значение, то также
	if ( typeof value != 'undefined' ) { 
// сначала установить быстрый способ
		elem[name] = value; 
// По возможности воспользоватьсяsetAttribute 
		if ( elem.setAttribute ) 
			elem.setAttribute(name,value); 
	} 
// Вернуть значение атрибута
	return elem[name] || elem.getAttribute(name) || ''; 
}

rgl 15.03.2013 17:27

Цитата:

Сообщение от potato (Сообщение 240979)
name = { 'for': 'htmlFor', 'class': 'className' }[name] || name;

{ 'for': 'htmlFor', 'class': 'className' } - литерал объекта,
var temp = { 'for': 'htmlFor', 'class': 'className' }
равносильно:
var temp = new Object();
temp['for']='htmlFor';
temp['class']='className';

name = что-то || name;
равносильно
if( что-то ) name = что-то; // else name = name;

Все вместе получается примерно так:
var temp = new Object();
temp['for']='htmlFor';
temp['class']='className';
if( temp[name] )
  name = temp[name];

potato 15.03.2013 17:47

Спасибо. Теперь понял.:)

danik.js 15.03.2013 21:09

Что-то автор книги смешал в кучу атрибуты и свойства. Этого делать не стоит. В jQuery есть отдельно метод attr для работы с атрибутами и prop для работы со свойствами. Если все смешать в кучу - возникнет куча непоняток и косяков.

Кроме того, тут получается что при попытке установить атрибут class, код изменит свойство el.className (ок), и еще зачем-то создаст мусорный атрибут classname в не-IE браузерах.

В который раз наблюдаю как во всяких "умных" книжках пишут каку. Наверно и хороших книг то нет на свете по программированию js

potato 17.03.2013 03:15

Цитата:

Сообщение от danik.js
и еще зачем-то создаст мусорный атрибут classname в не-IE браузерах.

Я тоже заметил мусор "classname".

Цитата:

Сообщение от danik.js
В который раз наблюдаю как во всяких "умных" книжках пишут каку.

Ну книга вроде нормальная. Все примеры до этого были хорошо изложены и понятны. Только этот пример какойто кака. :D


Часовой пояс GMT +3, время: 02:37.