2015-07-03 24 views
5

JS'deki prototipsel mirasları anlıyorum ama sahip olduğum özel bir fikri göstermek için kod yazarken sorun yaşıyorum. Yönetici nesneleri Çalışan nesnelerden türetmek bu son derece basit bir senaryo düşünün:Prototipsiz prototip kalıtım mı?

function Employee() 
{ 
    this.name = "Axel"; 
    this.dept = "R&D"; 
} 

function Manager() 
{ 
    Employee.call(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

çıktısı:

Manager {name: "Axel", dept: "R&D", reports: Array[3]} 

Garibi, biz prototip mirası göstermede başardım geliyor bana. Ancak, prototype'u kullanmadığımız gerçekler beni rahatsız ediyor. Şüphesiz yukarıdaki kod bunu yapmanın yolu değil mi?

Birisi, yukarıdaki yaklaşımın başarısız olduğunu gösteren bir örnek sağlayabilir mi?

(Bu arada, örnek resmi Mozilla docs geliyor, eksi prototip ayarı: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model)

+0

Yukarıdaki yaklaşımda bir sorun yok. Bu durumda, sadece bir * tek nesneyi * değiştirirsiniz, oysa prototip ile * tüm nesneleri * aynı prototiple değiştirebilirsiniz. – meskobalazs

+0

@meskobalazs Korkarım klasik olarak eğitilmiş aklımı takip etmiyorum. Eğer bir 'yeni Yönetici()' yazıyorsam üç özelliği (isim, borç ve rapor) almaz mıyım? Bu şekilde, yolun aşağısında bulunan __all nesneler üzerinde değişiklik yapıldığı görülüyor. – dotslash

+2

Burada hiç bir prototip veya prototipik miras kullanmıyorsunuz. Bunun yerine, doğrudan her bir nesneye özellikler yerleştiriyorsunuz. –

cevap

2

Çeşitli yorumlarda bunu tekmeledik, ancak bazı şeyleri açıklığa kavuşturabilecek bir örnek vermek istedim. Orijinal kod ile başlayan: Biz de şöyle tam aynı şeyi yapabilirdi

function Employee() 
{ 
    this.name = "Axel"; 
    this.dept = "R&D"; 
} 

function Manager() 
{ 
    Employee.call(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

:

function setEmployee(emp) 
{ 
    emp.name = "Axel"; 
    emp.dept = "R&D"; 
} 

function Manager() 
{ 
    setEmployee(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

Şimdi .call() veya .apply() kadar süslü bir şey kullanmadım. Manager yapıcısı basitçe başka bir işlevi çağırır ve this değerini doğrudan bir argüman olarak geçirir. Kod, daha önce yaptığı gibi aynı şeyi yapar.

Biz ayrıca bunu bir adım atmak olabilir: Biz Kurucular kullanmıyor, hatta this kullanmıyorsanız

Şimdi
function setEmployee(emp) 
{ 
    emp.name = "Axel"; 
    emp.dept = "R&D"; 
} 

function createManager() 
{ 
    var emp = {}; 
    setEmployee(emp); 
    emp.reports = ["Report 1", "Report 2", "Report 3"]; 
    return emp; 
} 

console.log(createManager()); 

- biz sadece açıkça bir nesne oluşturma ve fonksiyonları arasındaki etrafında geçiyoruz ve kod hala aynı şeyi yapar!

+0

Çaba için teşekkürler. Evet, işleri çok netleştirir. – dotslash

1
new Manager() instanceof Manager 
> true 
new Manager() instanceof Employee 
> false 
+0

Mükemmel! En azından, miras adına saçma sapan olduğumu doğruladı. : D – dotslash

2

Sen aslında hiçbir şey miras almadı. Belirli bir nesne üzerinde bir işlevi "uyguladınız". Birçok fonksiyonel dilin bunu yapabileceğini düşünüyorum.

Kalıtım, belirli bir nesne üzerinde yalnızca ilgisiz işlevleri değil, miras almak için kullanılır.

Örneğinizde, örneğin yöntemleri nasıl devralacağınızı kapsamayacaksınız. Örneğin, Proxy aracılığıyla yöntem mirasını uygulamaya çalışmış olsanız bile, bu üst öğeyi miras aldığınız anlamına gelmez.

+0

Ah! Yani 'isim' ve 'borç' yukarıdaki 'Çalışana' değil, 'Yönetici'ye ait mi? Eğer öyleyse, bunu nasıl doğrulayabilirim? – dotslash

+1

Örneğinizde 'name' ve' dept '' manager' veya 'Employee'ye ait değildir. Bunlar, her bir nesne üzerinde belirlediğiniz özelliklerdir ve "Yönetici" veya "Çalışanın" prototipleriyle hiçbir ilgisi yoktur. –

+0

Başka bir deyişle, tüm söylenip yapıldığında, tek tek nesneye açıkça ayarladığınız kendi özelliklerine sahip bir nesne oluşturdunuz. Bu özelliklerin "Yönetici" işlevinde mi yoksa "Çalışan" işlevinde mi, yoksa açıkça adlandırdığınız başka bir rastgele işlevde mi olduğu fark etmez. Her durumda, basitçe * bireysel nesnenin * özellikleridir. –