2011-02-05 17 views
5

Questo è il codice di lavoro:funzione Javascript hanno sub funzioni/variabili

var test = function() 
{ 
    console.log(test.data); 
}; 

test.data = 'hello'; 

test.set = function (data) 
{ 
    test.data = data; 
}; 

test.set('Test'); 
test(); 

Emette Test al mio console JavaScript. Ora mi stavo chiedendo, se ci fosse un modo per farlo usando qualcosa di simile?

var test = { 
    this: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 
+1

Le funzioni sono oggetti, ma gli oggetti non sono funzioni. Ovviamente è possibile memorizzare le funzioni come proprietà dell'oggetto ma non è possibile rendere un oggetto semplice "callable". O cosa vuoi veramente raggiungere? Quale dovrebbe essere il vantaggio del tuo secondo approccio? –

+0

Voglio chiamare function test.this() usando solo test() – Ragnis

+0

@Felix. Credo che manchi il punto: penso che stia cercando di incapsulare tutte le informazioni, e di avere un approccio più ordinato/più organizzato. – xil3

risposta

5

Come ho scritto nel mio commento, non è possibile rendere un oggetto "callable". È tuttavia possibile automatizzare il processo dal primo esempio:

function extend(func, props) { 
    for(var prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      func[prop] = props[prop]; 
     } 
    } 
    return func; 
} 

e quindi chiamare con:

var test = extend(function(){ 
    console.log(test.data); 
}, 
{ 
    data: 'hello',  
    set: function (data) { 
     this.data = data; // note that I changed it to `this.data` 
    } 
}); 

DEMO


Detto questo, penso che non si dovrebbe usare funzioni come quella. Sarà più facile capire se hai solo un oggetto "normale" e chiama ogni metodo con obj.method() invece di avere obj().

Almeno devi documentarlo con molta attenzione.

+0

Dov'è la chiamata 'hasOwnProperty'? ;) –

+0

@Ivo Wetzel: Beh, supponevo che si passasse comunque solo oggetti semplici ... ma sì ... estensione di 'Object.prototype' ... bla bla ... (Spero che un giorno realizzino l'integrato prototipi ** non ** estendibili!) ... risolto :) –

+0

Sarebbe una grande cosa, ma dubito che lo faranno mai: / –

0

È possibile memorizzare qualsiasi funzione in Proprietà nell'oggetto. E puoi invocarli:

let f = { fun1: function() 
       { 
        return 1; 
       } 
     }; 
f.fun1(); 

funzionerà perfettamente. Non sono sicuro che tu possa utilizzare "questo" come nome di una proprietà in quanto è una parola chiave. Probabilmente non c'è problema, ma potrebbe essere fuorviante.

+0

In realtà il secondo esempio era più simile a uno pseudo codice. – Ragnis

2

ne dite di fare qualcosa di simile:

function Test() { 
    this.data = 'hello'; 
    this.set = function (data) 
    { 
     test.data = data; 
    } 
    this.log = function() 
    { 
     console.log(test.data); 
    } 
} 

var test = new Test(); 
test.set('Test'); 
test.log(); 

Questo ha il vantaggio è possibile creare nuove istanze facilmente.


Se si desidera solo una tantum, direi proprio suggerimento è quasi ciò che si vuole:

var test = { 
    log: function() 
    { 
     console.log(test.data); 
    }, 

    data: 'hello', 

    set: function (data) 
    { 
     test.data = data; 
    } 
}; 

test.set('Test'); 
test.log(); 

Ma forse la tua domanda è stata come evitare la parte "log"?

+0

Sì, voglio evitare quella parte ".log". – Ragnis

+0

Quindi vuoi che il log sia essenzialmente in un costruttore? – xil3