2012-01-18 10 views
8

मैं CoffeeScript में एक वर्ग कैसे दृष्टांत है में एक वर्ग के नाम से एक CoffeeScript वर्ग इन्स्तांत जब मैं केवल एक स्ट्रिंग में क्लास का नाम है?एक स्ट्रिंग

class Dog 
    bark:-> 
    "Woof" 

className = "Dog" 
dog = new className # <--- I would like to create an instance here using the string 

उत्तर

11

थोड़ी दूरदर्शिता के साथ आप औरeval का उपयोग करके स्वयं को सुरक्षित रख सकते हैं। वर्गों है कि आप नाम से दृष्टांत करना चाहते हैं की एक सूची कहीं रखें:

class Dog 
    bark:-> 
    "Woof" 

# Or window.named_classes if you need to access 
# `named_classes` globally (or just in another 
# CoffeeScript file). 
named_classes = { Dog: Dog } 

और फिर अपने देखने के बजाय टेबल eval का उपयोग करें:

name = 'Dog' 
dog = new named_classes[name] 

जब आप कहते हैं कि class Dog, आप एक स्थानीय के साथ खत्म चर Dog कहा जाता है:

var Dog; 
Dog = (function() { /* ... */ })(); 

और वहाँ एक स्थानीय JavaScript वैरिएबल पर प्राप्त करने के लिए जब तक आप इसे somewher की दुकान कोई रास्ता नहीं है ई कि आप नाम से उपयोग कर सकते हैं। यह भी ध्यान रखें कि eval अगर आप एक CoffeeScript फ़ाइल में Dog को परिभाषित करने और इसे एक और उपयोग करना चाहते काम नहीं करेगा, CoffeeScript wraps each file in self-executing anonymous function to limit variable scope:

सभी CoffeeScript उत्पादन एक गुमनाम समारोह में लपेटा जाता है: (function(){ ... })(); यह सुरक्षा रैपर, var कीवर्ड की स्वचालित पीढ़ी के साथ संयुक्त, दुर्घटना से वैश्विक नामस्थान को प्रदूषित करना बहुत कठिन बना देता है।

आप अन्य लिपियों का उपयोग करने के लिए, शीर्ष स्तर के चर बनाने खिड़की पर गुण के रूप में उन्हें देते हैं, या CommonJS में निर्यात वस्तु पर करना चाहते हैं तो।

+2

उसमें जोड़ने के लिए, तथ्य के बाद उन्हें इकट्ठा करने के बजाय, आपको उन्हें शुरू करने के लिए नामस्थान के लिए अधिक सुविधाजनक लग सकता है। कहीं से पहले सब कुछ: 'myClasses = {}' बाद में: 'वर्ग myClasses.Dog' अंत:' कुत्ते = नए myClasses [ "डॉग"] ' –

+0

@Chris: हाँ, यह एक अच्छी बात है। आप 'क्लास विंडो। डॉग' या 'क्लास विंडो' नाम_क्लास.डॉग 'का उपयोग कर सकते हैं लेकिन 'window.Dog' को' विंडो 'और' window.name_classes.Dog' प्रदूषित करने का जोखिम 'कुत्ते' को थोड़ा बोझिल बनाता है। आप 'name_classes.Dog = class Dog भी कर सकते हैं ... 'लेकिन वह है, आईएमओ, थोड़ा बदसूरत। –

+0

@ क्रिस: ऐसा लगता है कि हम एक ही समय में टिप्पणियां संपादित कर रहे हैं (और मेरा इंटरनेट कनेक्शन डोडी है!)। वैसे भी, वांछित प्रभाव प्राप्त करने के कई तरीके हैं, महत्वपूर्ण बात यह है कि कक्षा में किसी ऑब्जेक्ट में संदर्भ को संग्रहीत करना ताकि उसके पास प्रोग्राम-सुलभ नाम हो। –

1

ध्यान में रखना यह बहुत अच्छा कोड नहीं है, लेकिन मैं बेहतर तरीके से नहीं सोच सकता था।

eval का उपयोग करना:

class Dog 
    bark:-> 
    "Woof" 


className = "Dog" 
dog = new (eval(classname))() 

मैं सोच रखेंगे।

+0

हाँ, मैं इस बारे में सोचा है, लेकिन मुझे उम्मीद थी कि वहाँ एक और अधिक आकर्षक तरीका होगा। –

+0

eval के लिए एक बहुत अनावश्यक कॉल के लिए नीचे वोट। Eval से बचें! एमयू का सही उत्तर यहां है। –

+0

@ChrisSubagio मैंने कहा था कि यह एक अच्छा विचार नहीं था, मैं बस एक बेहतर विचार नहीं कर सका। – Jivings

3

यदि सामान्यजेएस मॉड्यूल का उपयोग करते हैं तो क्या कोई ऐसा कुछ कर सकता है?

फ़ाइल: Dog.coffee

class Dog 
    sound:()-> 
    "woof" 

फ़ाइल: Cat.coffee

class Cat 
    sound:()-> 
    "meow" 

फ़ाइल: Main.coffee

className = 'Dog' 
Animal = require(className) 
animal = new Animal 
animal.sound 
# => "woof" 

className = 'Cat' 
Animal = require(className) 
animal = new Animal 
animal.sound 
# => "meow" 
0

कैसे इस बारे में?

dog.coffee

class Dog 
    bark:-> 
    "Woof" 

app.coffee

@Dog = require './dog' 
className = "Dog" 
dog = new @[className] 
+0

यह बराबर है करने के लिए: वर्ग @Dog छाल: -> "Woof" className = 'कुत्ता' कुत्ते = नए इस [className] चेतावनी dog.bark() –