2013-01-05 16 views
5

पर विधि कहा जाता है, मैं ऑब्जेक्ट उन्मुख कॉफ़ीस्क्रिप्ट का उपयोग करके एक नोड.जेएस अनुप्रयोग बना रहा हूं।कॉफ़ीस्क्रिप्ट: कक्षा के उदाहरण को गतिशील रूप से

class User extends RedisObject 

जब मैं फोन User class मैं चाहता हूँ पर find() की तरह एक उपवर्ग है

class RedisObject 
@find: (id, cb) -> 
    client.HGETALL "#{@className()}|#{id}", (err, obj) => 
     unless err 
     cb(new RedisObject(obj, false)) 

यह User का एक उदाहरण के बजाय पारित करने के लिए:

मैं की तरह एक स्थिर विधि के साथ एक super class है कॉलबैक फ़ंक्शन पर RedisObject का।

मैं विधि

@constructor.name 

और eval() का उपयोग का उपयोग कर इसे से एक उदाहरण उत्पन्न करने के लिए पर कहा जाता है वास्तविक वर्ग के वर्ग के नाम हो रही द्वारा यह एहसास करने की कोशिश की है - लेकिन समस्या यह है कि उपवर्ग होगा है superclass के भीतर से अपरिभाषित हो।

find विधि द्वारा लौटाए गए विभिन्न प्रकार के उदाहरणों को प्राप्त करने के व्यवहार को मैं कैसे समझा सकता हूं, इस वर्ग के आधार पर प्रत्येक कक्षा में इसे ओवरराइड किए बिना, किस वर्ग पर इसे कॉल किया जाता है?

उत्तर

6

मैं कॉफीस्क्रिप्ट में एक विशेषज्ञ नहीं हूं, लेकिन यह काम नहीं करेगा?

class RedisObject 
    whoami:() -> "I am a RedisObject" 
    @find:() -> 
    new this() 

class User extends RedisObject 
    whoami:() -> "I am a User" 

console.log RedisObject.find().whoami() // -> "I am a RedisObject" 
console.log User.find().whoami()  // -> "I am a User" 

कम से कम उपरोक्त परीक्षण पास लगता है।

+0

धन्यवाद! अच्छी तरह से काम। – Matthias

+1

बीटीडब्ल्यू, "नया यह" दस्तावेज सुविधा नहीं है, मैं इसे कक्षा अनुभाग से नहीं ढूंढ सकता। यह वास्तव में उपयोगी है, इसे specced किया जाना चाहिए। – Ciantic

0
@find: (id, cb,klass=RedisObject) -> 
    client.HGETALL "#{@className()}|#{id}", (err, obj) => 
     unless err 
     cb(new klass(obj, false)) 

और उप वर्ग

@find: (id, cb,klass=User) -> 
    super(id,cd,klass) 

है कि मैं क्या कर सकता है, हालांकि यह 100% गतिशील नहीं है में।

संबंधित मुद्दे