2016-03-26 43 views
1

Bu nedenle, özellikle, belirli bir nesneyi devralan CoffeeScript sınıflarını yazmakla ilgili olarak, nasıl bir prototip kalıtımla çalışıyorum. Crockford'un nesne işlevine benzer bir başka sınıftan ziyade. Esasen yapmak istediğim, yapıcısına iletilen belirli bir nesneden miras alabilecek bir sınıf yazmaktır. Ne yazık ki, bu konuda endişe verici uyarılar göz önüne alındığında, yapmamayı tercih ediyorum setPrototypeOf, bu olmadan imkansız olabileceğini düşünüyorum. Bunun yerine, benzer bir şey yapabilecek bir fonksiyona yerleşeceğim. ŞimdiÖnceden varolan bir nesneyi uzatan bir CoffeeScript sınıfının örneğini başlatmak için yardımcı işlevler

a = {foo: 1} 

class Example 
    constructor: (@bar) -> 

extendObject = (parent, Class, args...) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    new F args... 

extendObjectMaker = (parent, Class) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    F 

maker = extendObjectMaker a, Example 

test1 = extendObject a, Example, 2 
test2 = new maker 2 

ben büyük ölçüde ardından düzenli yapıcı sözdizimi kullanabileceğiniz yeni sınıf vardır o dönüyor aslında ne yana, ikinci yaklaşımı tercih: Aşağıda iki ihtimal vardır. Sadece bir sorun var: extendObject kullanılarak oluşturulan nesneler doğru olarak Example s olarak tanımlanırken, extendObjectMaker tarafından döndürülen yapıcı kullanılarak oluşturulan nesneler F s olarak tanımlanır ve Example örneğidir.

console.log test1 instanceof Example # True 
console.log test2 instanceof Example # False 

Bu işlevlerin hemen hemen aynı kodu kullandıkları göz önüne alındığında, neden farklı davranış sergilediklerini bulmakta zorluk çekiyorum. Bu nedenle, test2'un neden Example olarak görünmediğini ve bunu yapmak için neyi değiştirmem gerektiğini bilen var mı?

+0

görünüyor :) – Ven

+0

Uh, neden böyle olsun? – rmehlinger

+1

Oh, çok üzgünüm! Mobil cihazlarda Stackoverflow, başka bir stackexchange web sitesinin renk düzenine sahip! – Ven

cevap

2

CoffeeScript kaynak koduna bakın: http://coffeescript.org/v1/annotated-source/nodes.html#section-60.

CoffeeScript, kurgu çağrılarını, bir uyarıyla (args...) veya tek bir tanesinin bulunmadığına bağlı olarak farklı şekilde ele alır.

Eğer ya aşağıdaki gibi işlevini yeniden yazma new maker [2]...veya ile extendObjectMaker çağırmak durumunda istenilen sonucu verecektir Kodunuz: Eğer bunun için doğru web sitesinde değillermiş gibi

extendObjectMaker = (parent, Class) -> 
    F = (anon...) -> Class.apply(@, anon) 
    F:: = Object.create parent 
    F::constructor = Class 
    (args...) -> new F args... 
+0

Maalesef, şu anda bağlantı yok –

+1

Güncellendi! Bunun yalnızca CoffeeScript 1.x ile ilgili olduğunu unutmayın - CoffeeScript 2'nin farklı yapıcı çağrılarını nasıl ele alacağından emin değilsiniz. –