2012-07-10 12 views
12

È possibile aggiungere un metodo a un array() in javascript? (Conosco i prototipi, ma non voglio aggiungere un metodo a ogni array, solo uno in particolare).Aggiungi un metodo all'oggetto Array in Javascript?

Il motivo che voglio fare questo è perché ho il seguente codice

function drawChart() 
{ 
    //... 
    return [list of important vars] 
} 

function updateChart(importantVars) 
{ 
    //... 
} 

var importantVars = drawChart(); 

updateChart(importantVars); 

E io voglio essere in grado di fare qualcosa di simile a questo, invece:

var chart = drawChart();<br> 
chart.redraw(); 

Speravo ci era un modo in cui potevo semplicemente collegare un metodo a quello che sto restituendo in drawChart(). Come posso farlo?

+0

Questo ha già risposto più volte, tuttavia, tenere questo in mente: * metodi in JavaScript sono di prima classe [function] Valori *. Cioè, sono * solo funzioni * che sono nominate da - cioè, sono il risultato di una valutazione - * proprietà *. –

+1

Questo è chiaramente possibile, ma è consigliabile? Ci sono effetti collaterali? Quando si itera sull'array, il metodo si intrometterà? Il metodo conta quando si ottiene la lunghezza dell'array? – arkanciscan

risposta

30

array sono oggetti, e possono quindi contenere proprietà quali metodi:

var arr = []; 
arr.methodName = function() { alert("Array method."); } 
3

Basta istanziare l'array, creare una nuova proprietà e assegnare una nuova funzione anonima alla proprietà.

var someArray = []; 
var someArray.someMethod = function(){ 
    alert("Hello World!"); 
} 

someArray.someMethod(); // should alert 
7

Sì, facile da vedere:

array = []; 
array.foo = function(){console.log("in foo")} 
array.foo(); //logs in foo 
+0

.. tranne in IE: p ~ –

+1

Il commento su IE era un paio di versioni fa, si applica ancora? – jmoreno

1
function drawChart(){ 
{ 
    //... 
    var importantVars = [list of important variables]; 
    importantVars.redraw = function(){ 
     //Put code from updateChart function here using "this" 
     //in place of importantVars 
    } 
    return importantVars; 
} 

Facendo in questo modo rende così puoi accedere al metodo direttamente dopo averlo ricevuto.
cioè

var chart = drawChart(); 
chart.redraw(); 
+0

Frustrante che questa risposta non ha ottenuto più upvotes. Questo è l'unico che indirizza l'OP: come incorporare effettivamente la matrice con la funzione associata ** nel risultato di ritorno **. (Come accade, questo è esattamente quello che dovevo sapere. Grazie, @Aust!) –

0
var arr = []; 
arr.methodName = function() {return 30;} 
alert(arr.methodName); 
+0

Mentre questo codice può rispondere alla domanda, fornire un contesto aggiuntivo su come e/o perché risolve il problema potrebbe migliorare il valore a lungo termine della risposta . –