2012-02-08 19 views
5

çağrılırken tanımsızdır "Javascript: The good parts" adlı kitabı okuyorum.TypeError: this.prototype, Function.prototype.method()

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

GÜNCELLEME:
Neden kod çalışmıyor Aşağıdaki
Şimdi Takviye türleri hakkında bölüm okuyorum? kod aşağıdaki

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

Ama sorunsuz çalışır:

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

Neden bu kod çalışır?

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" nesnesidir.
Ama bunun üzerine yöntem "yöntemini" çağırabilirim.
İşlev.prototype.method ve obj.method arasındaki fark nedir?

cevap

5

this, Function.prototype ürününe atıfta bulunuyor, çünkü bu konuda .method numaralı telefonu aradınız. Yani, mevcut olmayan Function.prototype.prototype kullanıyorsunuz.

.prototype s sayfalarından birini ortadan kaldırmak için Function.method(...) veya this[name] = ... kullanın.

+0

Teşekkür ederim. Şimdi anladım. Bu satırda dikkat etmedim this.prototype [name] = func; –

5

Çünkü:

Function instanceof Function   // <--- is true 
Function.prototype instanceof Function // <-- is false 
  • Function.prototype bir nesne olduğunu ve Fonksiyon işinin müteahhidi şey miras etmez.
  • Function bir kurucu, ancak aynı zamanda bir işlevdir, bu nedenle Function.prototype yöntemlerini devralır.

  • Function.method numaralı telefonu ararken, Function örneğinin method yöntemini çağırıyorsunuz. Yani, this, oluşturulan örneğe Function işaret eder.
  • Function.prototype.method numaralı telefonu ararken, bir nesnenin olağan bir yöntemini çağırıyorsunuz demektir. this, Function.prototype'a işaret eder.

netleştirmek için, işte size bir örnek:

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

Lütfen sorumdaki güncellemeye bakın. –

+0

"Function.prototype.method' işlevini çağırırken, sıradan bir işlevi çağırıyorsunuz." Bu "undefined (katı mod) veya" window "değerini işaret ediyor. - bu doğru değil. Onu çağırdığın nesneye işaret eder; bu durumda 'Function.prototype'. – pimvdb

+0

@pimvdb Peki, bu sorudan Function.prototype nesnesi ile object obj arasındaki fark nedir? –

0

prototip işlevi ilan edildiğinde sadece kullanılır, fakat onu aradığınız zaman değil. Prototip işlevi, bu nesnenin her örneği ile oluşturulmuş nesnenin bir üyesi yapar.