Цепочка функций
Сделал аналог цепочек jQuery.
код:
(function(){
var
window = this,
undefined,
jQuery = window.jQuery = window.$ = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
// Если selector - объект, возвращаем его
if ( selector.nodeType ) {
this[0] = selector;
return this;
}
// В противном случае берем элемент по id
var elem = document.getElementById( selector );
var ret = jQuery( elem );
return ret;
},
// Наши функции
raz: function() {
this[0].innerHTML += 'первая пошла, ';
return this;
},
dva: function() {
this[0].innerHTML += 'вторая пошла, ';
return this;
},
tri: function() {
this[0].innerHTML += 'третья пошла ';
return this;
}
};
jQuery.fn.init.prototype = jQuery.fn;
})();
sample:
<div id='sampleid'></div>
<script type="text/javascript">
$('sampleid').raz().dva().tri();
</script>
Можно ли использовать такую реализацию цепочек? Какие могут возникнуть проблемы? |
что-то куча связей fn-init-prototype и ненужных оберток
function $(…) {
return new $.wrapper(…);
}
$.wrapper = function (…) {
this… = …;
};
$.wrapper.prototype = $.prototype = {
constructor: $,
raz: …,
dva: …,
tri: …
};
Проблем вроде нет, если удобно, ни что не мешает использовать. |
Цитата:
|
Это из jQuery
var // Will speed up references to window, and allows munging its name. window = this, // Will speed up references to undefined, and allows munging its name. undefined, |
Цитата:
1. Самое главное - если он вызывает в дальнейшем код в контексте this, который был присвоен изначально в локальную переменную window (т.е. глобальный объект), то this - всегда будет работать быстрее, т.к. this не резолвится вообще, он определён единожды при входе в контекст, а вот локальная переменная window будет резолвится всегда при обращении. Так что, здесь имеет место быть явное недопонимание, как и почему "оно" так работает. 2. Есть принципиальная разница между объектом window и глобальным объектом (this в глобальном контексте - есть глобальный объект). Первый - это хост-объект, второй - это нативный объект. Да и не всегда, window - рекурсивная ссылка на глобальный объект; в некоторых реализациях это не так (хотя в стандарте - и в 3-ей, и в 5-ой редакциях это отмечается). А тут, получается, автор этого кода сохраняет в локальную переменную глобальный объект (т.е. уже меняет поведение, которое было бы у хост-объекта windiow), и, наивно думает, что это что-то ускорит. Наоборот. Если бы он сделал var window = window, было бы другое дело. А в его случае, удобней было бы всегда использовать this, который был бы определён только один раз, а не постоянно, как window. |
Спасибо.
А разработчикам jQuery это никто не смог объяснить? |
Цитата:
|
Цитата:
1) Тут вполне можно вместо window поставить this Цитата:
Цитата:
Цитата:
кстати, присоединяюсь к PeaceCoder, по поводу использования фреймвороков, порой зайдешь на форум, что бы найти алгоритм решения определенного вопроса, и порой появляется отвращения от всех тем(даже в разделе "для профи"), так как все только и знают, как решить вопрос с помощью фреймворков, а где же чистый javascript, про который наверно уже все забыли...а может и вообще не знали, в итоге появляется стада баранов, а не программистов, у которых спросишь "А ты знаешь javascript?" а они ответят: "да, конечно, это же jQuery", прям даже страшно становиться )))) |
Цитата:
Цитата:
фреймворки vs. JS это тоже самое как Assembler vs C++ или C++ vs VisualBasic Как можно доказывать что высоко уровневый язык быстрее своего родителя? А таких не мало... |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Любой идентификатор разрешается - определяется, к какой области видимости в иерархической цепи, он относится. Это делается каждый раз при обращении к имени переменной. Соответственно, чем глубже контекст исполнения, тем дольше будет разрешаться идентификатор, определённый в более высоких контекстах исполнения (например, глобальном контексте).
(function () {
(function () {
(function () {
alert([this, window]);
})();
})();
})();
Здесь, чтобы разрешить имя window нужно просмотреть scope chain (цепь областей видимости) из самого глубокого контекста исполнения - и вверх по цепи, т.е. 4 звена цепи. В свою очередь, this, как уже было отмечено, никогда не разрешается, он определён один раз при входе в контекст. Поэтому в alert-e из примера выше значение this будет получено сразу - в отличие от window. Однако, поскольку window - это host-объект, его разрешение (и вообще поведение) может зависеть от реализации. Подробней про scope chain: http://javascript.ru/blog/Dmitry-A.-...j-vidimosti.-0 |
Цитата:
А можно привести полный пример кода, а то не получается сделать рабочий пример :(( Говорит: $ is not defined |
Цитата:
<div id="div">text</div>
<script type="text/javascript">
function $(id) {
if(this.$) return new $.wrapper(id);
}
$.wrapper = function(id) {
if(typeof id == 'string' /* etc ... */) {
this.id = document.getElementById(id);
}
};
$.wrapper.prototype = $.prototype = {
constructor: $,
css: function(value) {
for(i in value) {
this.id.style[i] = value[i];
}
return this;
}
/* ,
....
*/
};
$('div').css({'color':'red', 'textTransform':'uppercase'});
</script>
|
| Часовой пояс GMT +3, время: 02:25. |