2011-06-22 41 views
9

Si expidojQuery constructor y init

console.dir(jQuery.prototype) 

me sale una hermosa lista de los métodos y propiedades que están en el objeto jQuery. Pero constructor e init están en rojo con un pequeño signo más junto a ellos.

P: ¿Qué hace que constructor e init sean diferentes a las otras funciones?

+0

Parecen iguales a todo lo demás aquí en Chromium. –

+0

Aunque no estoy seguro de nada, estoy dispuesto a apostar que tiene que ver con poder "anular" los métodos que están adjuntos al objeto jQuery. Los métodos de extensión jQuery se pueden hacer como Object.prototype.thisFunc = function() {// dosomething}; Esperando la respuesta correcta aunque – MoarCodePlz

+0

¿En qué navegador se ve diferente? Es todo lo mismo en Chrome. –

Respuesta

1

Muestra que estas funciones tienen propiedades/métodos adicionales definidos para/establecer en ellos.

2

Supongo que es porque constructor e init no son solo funciones "puras". Esto significa que tienen propiedades adicionales (por ejemplo, init tiene su propio prototipo), y es por eso que son expandibles. Para ilustrar esto un poco más lejos:

// size is defined as something like this 
jQuery.prototype.size = function() { 
    // do stuff 
}; 
// init is defined as a function too, but with additional properties 
jQuery.prototype.init = function() { 
    // do other stuff 
}; 
jQuery.prototype.init.functionIsAnObject = true; 

En otras palabras: Una función es un objeto, esto significa que puede adjuntar ningún propiedades que desee.

+0

Puede adjuntar propiedades a cualquier cosa. 'jQuery.each.foo = 5; console.log (jQuery.each.foo); ' – Dogbert

+0

@Dogbert: Cualquier cosa que sea un Objeto. No funcionará en tipos de datos primitivos. Algo como'var x = 3; x.text = "hello world" 'no funcionará, es decir, x sigue siendo 3 y x.text no está definido. Aunque pensé que establecer una propiedad en un tipo de datos primitivo no arroja un error como esperaba ... –

3

Firebug comprueba si una función tiene el aspecto de una función de clase (obj.prototype contiene al menos 1 propiedad) y la muestra como una clase con propiedades expandibles.

http://code.google.com/p/fbug/source/browse/branches/firebug1.8/content/firebug/dom/domPanel.js#531

if (isClassFunction(val)) 
    this.addMember(object, "userClass", userClasses, name, val, level, 0, context); 

http://code.google.com/p/fbug/source/browse/branches/firebug1.8/content/firebug/dom/domPanel.js#1960

function isClassFunction(fn) 
{ 
    try 
    { 
     for (var name in fn.prototype) 
      return true; 
    } catch (exc) {} 
    return false; 
} 

Puede probarlo ejecutando esto en Firebug

function isClassFunction(fn) 
{ 
    try 
    { 
     for (var name in fn.prototype) 
      return true; 
    } catch (exc) {} 
    return false; 
} 
test = [jQuery.prototype.init, jQuery.prototype.constructor, jQuery.prototype.each, jQuery.prototype.get]; 
for(var i = 0; i < test.length; i++) { 
    console.log("" + i + ": " + isClassFunction(test[i])); 
} 

salida

0: true 
1: true 
2: false 
3: false 
Cuestiones relacionadas