2012-02-08 11 views
5

Sto leggendo il libro "Javascript: Le parti buone".
Ora mi sto leggendo il capitolo su Tipi Convertire i:TypeError: this.prototype non è definito quando si chiama Function.prototype.method()

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

UPDATE:
Perché seguente codice non funziona?

js> Function.prototype.method("test", function(){print("TEST")}); 
typein:2: TypeError: this.prototype is undefined 

Ma seguente codice funziona senza problemi:

js> Function.method("test", function(){print("TEST")}); 
function Function() {[native code]} 

Perché questo codice funziona?

js> var obj = {"status" : "ST"}; 
js> typeof obj; 
"object" 
js> obj.method = function(){print(this.status)}; 
(function() {print(this.status);}) 
js> obj.method(); 
ST 

"obj" è un oggetto.
Ma posso chiamare il metodo "metodo" su di esso.
Qual è la differenza tra Function.prototype.method e obj.method?

risposta

5

this si riferisce a Function.prototype perché hai chiamato .method su quello. Quindi, stai usando Function.prototype.prototype che non esiste.

Utilizzare Function.method(...) o this[name] = ... per eliminare uno dei .prototype s.

+0

Grazie. Ora capisco. Non ho prestato attenzione alla seguente riga this.prototype [nome] = func; –

5

Perché:

Function instanceof Function   // <--- is true 
Function.prototype instanceof Function // <-- is false 
  • Function.prototype è un oggetto, e non eredita nulla dal contructor funzione.
  • Function è un costruttore, ma anche una funzione, quindi eredita i metodi da Function.prototype.

  • Quando si chiama Function.method, si chiama il metodo method di un'istanza di Function. Quindi, this punta all'istanza creata di Function.
  • Quando si chiama Function.prototype.method, si sta invocando un metodo normale di un oggetto. this punti a Function.prototype.

Per chiarire, ecco un esempio:

Function.method()    // is equivalent to 
(function Function(){}).method() 
(new Function).method()   // Because Function is also a function 

Function.prototype.method // No instance, just a plain function call 
+0

Vedere l'aggiornamento nella mia domanda. –

+0

"Quando si chiama' Function.prototype.method', si sta invocando una funzione ordinaria. "Questo" punta a undefined (strict mode) o 'window'." - questo non è corretto. Indica l'oggetto su cui lo stai chiamando; in questo caso, 'Function.prototype'. – pimvdb

+0

@pimvdb Quindi qual è la differenza tra l'oggetto Function.prototype e object obj dalla mia domanda? –

0

prototipo viene utilizzato solo quando si dichiara la funzione, ma non quando si stanno chiamando. Prototype rende la funzione un membro dell'oggetto che viene creato con ogni istanza di quell'oggetto.

Problemi correlati