2016-07-01 26 views
5

Nesnelerin prototiplerini başka bir nesneyle göstermenin bir yolu var mı? Bu kodda Nesnede prototip gösterme

var foo = function() { 
    var foo = { 
     bar: bar, 
     boo: boo 
    } 
    return foo; 

    function bar (age) { 
     this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
    } 

    function boo (age) { 
     this.age = age; 
     boo.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
     } 
    } 
    } 

    var foo = foo(); 
    var far = new foo.bar(13); // bar {age: 13} 
    far.shoutAge(); // far.shoutAge is not a function 

    var far = new foo.boo(13); // boo {age: 13} with __proto__ 
    far.shoutAge(); // alert('My age is 13'); 

, 'bar' nesne prototip miras ile kurulur - ama açığa çubuğu 'shoutAge' mirasını kaybeder.

Ancak 'boo' nesne prototip bunun içinde bildirilen ve dış fonksiyon yöntemiyle 'shoutAge' erişimi vardır vardır.

Bu ikincisinin, işlev görse de en iyi uygulama olduğunu düşünmüyorum. Peki buradaki en iyi uygulama ne olurdu?

Ben potansiyel 'bar' örnekleri yüzlerce var, özellikle kendi 'shoutAge' yöntemidir olması 'bar' her örneğini istemiyoruz. Genellikle 'bar' için ayrı bir nesne 'foo'? Ben bar.prototype atama kodunuzda asla çalıştırılmaz, çünkü bu olduğunu düşünüyorum

var Foo = function() { 

    function bar (age) { 
    this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
    alert('My age is ' + this.age); 
    } 

    var foo = { 
    bar: bar, 
    boo: boo 
    } 
    return foo; 
} 

: bu sadece bir emir-of-operasyonlar konudur gibi

+0

Miras burada nerededir? Ne 'bar' ne de 'boo' birbirinden mi yoksa 'foo'yu miras almaz. –

+0

'uzak' bar.prototype' veya 'boo.prototype' öğesinden devralır – Oriol

+0

Programınızı yazdırmayı deneyin. –

cevap

3

görünüyor. bar işlev tanımı hoisted alır, bu nedenle döndürdüğünüz nesnede kullanılabilir, ancak prototip atama return ifadesinden sonra ek bir ifadedir ve denetim akışı asla ona ulaşmaz. Sonuna doğru return taşınıyor sorunu giderir.

+0

+1, iyi bir açıklama. OP'nin bilmediği hallerde, kaldırma işleminin ne olduğuyla ilgili bir bağlantıya da değinebilir. –

+0

@OmriAharon Eklendi. – nrabinowitz

+0

Bu, okuduğumda çok anlamlı oldu ve geçmişte sadece kısa bir süre kaldı. Ne yazık ki bu hala.shoutAge bir işlev değil atıyor. İşte bir örnek olarak [jsfiddle] (https://jsfiddle.net/7j8ws41c/1/). * edit * Nevermind Bu yanlışı kemanda atamıştım, işe yarıyor. – amarshall