quinta-feira, 1 de setembro de 2016

Como funciona o jQuery - O que ele é - Hacking jQuery - II

Nesta continuação de "Hacking jQuery", vamos modificar a classe jQuery mínima para admitir o reuso de métodos:

tQuery.js

(function( window, undefined ) {

var
// Referência à raiz jQuery(document)
rootjQuery,

// Usa o documento correto de acordo com a chamada (sandbox)
document = window.document,
location = window.location,
core_version = "a.0.0",
init_selector,
jQuery = function( selector, context ) {
// O objeto jQuery é realmente o construtor init 'melhorado'
return new jQuery.fn.init( selector, context, rootjQuery );
}
jQuery.fn = jQuery.prototype = {
// Versão corrente do jQuery
jquery: core_version,

constructor: jQuery,
init: function( selector, context, rootjQuery ) {
var match, elem;
init_selector = selector;
// Manipula: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
},
size: function() {
if( typeof(this) == 'object' ){
var len = 0;
for (var o in this) {
len++;
}
}
this.context = document;
this.size = len; 
return this; 
},
version: function() {
this.versao = this.jquery;
return this;
}
}

window.jQuery = window.$ = jQuery;
jQuery.fn.init.prototype = jQuery.fn;
rootjQuery = jQuery(document);

})( window );

Agora vamos executar o arquivo HTML alterado:

rtQuery.html


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />

<title>jQuery Demo</title>

<script type="text/javascript" src="tQuery.js"></script>

</head>
<body id="b1" name="nb1" OnLoad="inicia();">
<p id="p1" name="np1">xxx xxx xxx</p>
</body>
<script>
function inicia(){
var a = $("#p1").version().size();
}
</script>
</html>

Vamos exibir apenas a fase de debug ao chegar no método "version":


Como "version" devolve "this", que é um ponteiro para a instância jQuery, quando o método "size" é invocado ...


e processado ...


o erro não mais ocorre.

No entanto, existe um erro de concepção. O método "size" deveria ser método de "version", portanto deveria estar dentro da sua definição. Fizemos esta "gambiarra" apenas para mostrar a concepção que possibilita métodos chamarem métodos dentro do objeto jQuery.

Nenhum comentário:

Postar um comentário