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ı?
görünüyor :) – Ven
Uh, neden böyle olsun? – rmehlinger
Oh, çok üzgünüm! Mobil cihazlarda Stackoverflow, başka bir stackexchange web sitesinin renk düzenine sahip! – Ven