2012-01-25 16 views
9

Forse un brutto titolo, ma questo è il mio problema: Sto costruendo un framework per saperne di più su javascript. E voglio usare lo stile "" jQuery "".

Come è possibile creare una funzione in cui lo () è opzionale?

$("p").fadeOut(); //() is there 
$.each(arr, function(k, v) {...}); //Dropped the(), but HOW? 

Questo è quello che ho messo a punto, ma non funzionano:

$2DC = function(selector) 
{ 
    return new function() { 
     return { 
      circle : function() 
      { 
       //... 
      } 
     } 
    } 
} 


$2DC("#id1"); //Work 
$2DC("#id2").circle(); //Work 
$2DC.circle(); //DONT WORK 
+2

Il titolo è confuso. Non credo che '$.()' Sia un codice JavaScript valido. –

+1

duplicato di [Come è il "jQuery" var una funzione e un oggetto?] (Http://stackoverflow.com/questions/2724784/how-is-the-jquery-var-a-function-and-an-object) –

+0

Voglio imparare da jQuery, quindi penso che sia meglio dare un'occhiata al codice sorgente: https://github.com/jquery/jquery –

risposta

23

$ è in realtà solo un alias per la funzione jQuery. È possibile chiamare la funzione con:

jQuery("p"); o $("p");

ma ricordate, in JavaScript è possibile collegare "roba" direttamente alle funzioni.

function foo(){ 
} 
foo.blah = "hi"; 
foo.func = function() { alert("hi"); }; 

foo.func(); //alerts "hi" 

Questo è il modo (concettualmente) è definita la funzione di jQuery each.

jQuery.each = function(someArr, callback) { ... 

E così ora jQuery.each è una funzione che può essere chiamata in questo modo:

jQuery.each([1, 2, 3], function(i, val) { 
}); 

o più familiare

$.each([1, 2, 3], function(i, val) { 
}); 

Quindi per il vostro caso particolare, di sostenere :

$2DC.circle(); 

Avresti per aggiungere la funzione circle direttamente a $2DC:

$2DC.circle = function(){ 
    // code 
}; 
+0

Grazie! :) E 'stato davvero facile ... Imparo molto costruendo un framework. – Sawny

+0

@Sawny: certo. JavaScript è molto divertente –

+0

Risposta perfetta, grazie. – Sid

0

Il metodo $.each che si fa riferimento a è una struttura sull'oggetto $ funzioni.

L'oggetto $ in jQuery è un oggetto funzione e, come qualsiasi oggetto in JavaScript, è possibile assegnare proprietà all'oggetto.

L'invocazione dell'oggetto della funzione $ funge da funzione di costruzione e restituisce una nuova istanza di oggetto creata dalla funzione jQuery.fn.init(). Il prototipo di jQuery viene copiato su jQuery.fn.init in modo che le istanze dell'oggetto appena create abbiano accesso ai metodi e ai plugin definiti su jQuery.

6

Le funzioni sono oggetti in JavaScript. Come tali, possono essere utilizzati come variabili, come ints, stringhe, ecc.

Nell'esempio, $2DC è una funzione che restituisce un oggetto contenente una funzione circle.

$2DC.circle(); non funziona come circle è solo una proprietà dell'oggetto restituito, non di $2DC stesso.

Nel caso di $.each, questo funziona come $ contiene una proprietà each. Il tuo $2DC può farlo anche tu. In questo modo:

$2DC.circle = function(){ 
} 

Ora, $2DC.circle(); funzionerà. Quindi, come vedi le funzioni sono oggetti, e come tali possono avere proprietà proprio come altri oggetti.

+0

+1, anche se mi hai battuto con un badge illuminato di 4 secondi :-) –

+1

@AdamRackis: Sono una risposta ninja^_^ –

1
$2DC.circle(); //DONT WORK 

questo non ha funzionato a causa $ 2DC non ha alcuna funzione con il nome circle. È solo una funzione

Dove come $2DC("#id2") restituisce un oggetto contenente nuova funzione avendo circle funzione in modo $2DC("#id2").circle(); funziona bene per voi.

Se si definisce

$2DC.circle = function(){ 

}; 

È possibile utilizzare $2DC.circle();

-1

Prova in questo modo:

$2DC = (function(selector) 
{ 
    return new function() { 
     return { 
      circle : function() 
      { 
       //... 
      } 
     } 
    } 
})(); 

questo modo il $ 2DC è l'oggetto restituito dalla funzione e non la funzione si.

+0

per il ragazzo che mi ha votato, devi essere un vero genio: http: // jsfiddle.net/andrepadez/Pdvju/ –

+0

In questo caso '$ 2DC' non è più una funzione, è solo un oggetto normale. '$ 2DC (" # id1 ");' non funziona più. Questo non è ciò che l'OP voleva. Ti ho down-votato per questo, e perché non hai spiegato il codice nella tua risposta. –

+0

È un oggetto, che restituisce funzioni, proprio come jQuery! prova il violino quindi –

0

Creare la funzione di base, quindi aggiungere metodi alla funzione.

var f = function(text){ 
    alert(text); 
} 
f.fn1 = function(text){ 
    alert('fn:'+text); 
} 
f.fn2 = function(text){ 
    alert('fn2:'+text); 
} 

f('hi'); //hi; 
f.fn1('hi'); //fn:hi; 
f.fn2('hi'); //fn2:hi; 
0

Può essere raggiunto utilizzando qualcosa di simile.

$.fn.each = function (otherparams); 

$.each = function (collection, otherparams) { 
    return $.fn.each.apply(collection, arguments.slice(1)); 
}; 

Aggiunta ciascuno come una proprietà di fn (che è solo un alias per jQuery.prototype) significa che è disponibile come metodo di ogni raccolta jQuery. Il secondo bit di codice significa che può essere passato invece in una raccolta come argomento.

apply (e call) sono alcune delle funzionalità più utili di javascript una volta che ci si abitua.