2010-05-20 33 views
5

Bunu buldum. Bu ne işe yarıyor?Bu ne yapar?

function G(a, b) { 
    var c = function() { }; 
    c.prototype = b.prototype; 
    a.T = b.prototype; 
    a.prototype = new c; 
} 
+1

Sanırım ne soruyorsun "neden bunu yapardı?", Çünkü "insanları karıştırmak" yerine, senin için hiçbir şeyim yok. – wlangstroth

+1

Bunu nereden buldunuz? Ayarlanan "T" özelliği, prototipik miras ile ilgili gördüğüm herhangi bir model için tipik değildir. Ama bunun olabileceğine inandığım şey, yapıcının prototip zincirinin yanı sıra devralınmasıdır. –

cevap

1

Crockford'un Object.create yöntemine benzer, ancak bu işlev kurucuları "kurmak" için kullanılır.

İki kurucu argüman olarak kabul eder ve ilkinin prototype ayarını yapar.

beni şifreli değişken isimleri yeniden adlandırmak edelim:

function G(sub, super) { 
    var F = function() { }; 
    F.prototype = super.prototype; 
    sub.superLink = super.prototype; 
    sub.prototype = new F(); 
} 

function Super() { 
    //... 
} 
Super.prototype.member1 = 'superMember1'; 

function Sub() { 
    this.member2 = 'subMember2'; 
} 

G(Sub, Super); 

new Sub(); // Object { member2="subMember2", member1="superMember1"} 

Düzenleme: T özellik sadece ne alt birinin "süper" yapıcı olduğunu bilmek kullanılır, ben bu modeli gördüm kitapta Pro JavaScript Design Patterns gibi başka yerlerde, (page 43), bazı eklemelerle, yanlış nesneye işaret etmek constructor özelliğini engellemek için:

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

Ayrıca bkz:

+1

Onun bu kadar basit olduğunu düşünmüyorum, 'T' özelliği bir şekilde soruyu net olarak kullanmaz. Ayrıca, cevabınız sonucu sadece 'Sub.prototype = Super.prototype' –

+1

@Sean Not olarak ayarlanarak ulaşılabilir. Bunu yaparak, "Sub.prototype" öğesine bir üye eklerseniz, "Super.prototype" öğesine bir üye de eklersiniz. –

+0

@CMS Ben 'üye 2' yeni Sub() 'değil ve yeni Sub()' nin kendisi için prototip zincirinde olacağını unutmayın. –

0

- a.prototype örneği yeni bir bunun kopyası. İnternette "alma" ve "ayar" için bu tür kodu kullanan örnekler vardır.