2012-01-17 14 views
8

Şu anda 'JavaScript İyi Parçaları' okuyorum ve ben aşağıdaki paragrafta rastladımPrototip mirasını kullanan javascript kodunda nesne ömrü nedir?

biz bir nesneden bir özellik değerini almaya çalışırsanız ve nesne özellik adını, ardından JavaScript girişimleri sahip değilse prototip nesnesinden özellik değerini almak için. Ve eğer bu nesne, özelliği olmayan ise, prototipine gider ve böylece 'a kadar süreç sonunda Object.prototype ile sonuçlanır.

Nes1 nesn1 nesnesini prototype olarak oluşturursam, bu, obj1 kapsam dışı kalana kadar obj1 imha edilemez mi?

+0

Gerçekten JavaScript motorlarının prototipi nasıl uyguladıklarını bilmiyorum, ama sanırım bir nesneye ** referans ** gibi gelmiyor. Daha çok bir miras mekanizması gibi, bu yüzden obj2'nin obj1 için bir ** örnek ** 'si gerekiyorsa şaşırırdım. –

cevap

5

Nesnenin mirasını oluşturduğunuz sürece (prototiplerle bağlantılı olarak), tarayıcının bu nesneye yaptığınız referanslara bağlı olduğunu düşünmüyorum.

ex1:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = new a(); 
a = undefined; 
var c = new a();// error => a is not a function any more! 
b.toString();// it works because the prototype is not destroyed, 
      // only our reference is destroyed 

ex2:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = function(){}; 
b.prototype = new a(); 
a = undefined; 
var c = new b(); 
console.log(c+'');// It still works, although our 
        // initial prototype `a` doesn't exist any more. 

GÜNCELLEME: Bu davranış javascript tam olarak bir nesneyi yok edemez gerçeğine ilgili olabilir ; Sadece tüm referansları kaldırabilirsiniz. Bundan sonra tarayıcı, Garbage collector aracılığıyla ilgisiz nesnelerle nasıl başa çıkılacağına karar verir.

+1

Hm, "b.prototype" gibi bir "sadece" bu nesneye bir başvuru değildi; Hala referansımız var gibi görünüyor. – kapa

+0

'b.prototype',' a' bir ** örneği ** 'dir. ('new' anahtar sözcüğünü hisset) –

+0

** adı olarak ** b.prototype' bir ** referanstır **, 'new a()', bir nesneye atanan bir nesneye adlandırılmamış bir başvuru döndürür. 'b.prototype' gibi adlandırılmış bir referans, ya da bir kez kullanılabilir ve bu şekilde kullanıldığında bu erişilemez hale gelir (kelimenin tam anlamıyla kapsam dışı kalır). – zuba

İlgili konular