2010-12-05 17 views
8

मैं एक वैरिएबल टाइप-स्ट्रिंग (ऑब्जेक्ट का नाम युक्त) के आधार पर जावास्क्रिप्ट में एक नई ऑब्जेक्ट कैसे बना सकता हूं?मैं टाइप-स्ट्रिंग के आधार पर जावास्क्रिप्ट में एक नया ऑब्जेक्ट कैसे बना सकता हूं?

अब मेरे पास है: (अधिक उपकरण सूची आने वाले लंबे समय तक मिल जाएगा के साथ ...)

function getTool(name){ 
    switch(name){ 
    case "SelectTool": 
     return new SelectTool(); 
     break; 
    case "LineTool": 
     return new LineTool(); 
     break; 
    case "BlurTool": 
     return new BlurTool(); 
     break; 
    case "PointerTool": 
    default: 
     return new PointerTool(); 
     break; 
    } 
} 

और की तरह मेरे उपकरण परिभाषित:

PointerTool.prototype = new Tool; 
PointerTool.prototype.constructor = PointerTool; 
function PointerTool(){ 
    this.name = "PointerTool"; 
} 
PointerTool.prototype.click = function(x, y){ 
    info("You clicked at: "+x+", "+y); 
} 

मैं की सवारी प्राप्त करना चाहते हैं (बढ़ रहा है) स्विच स्टेटमेंट, ऐसा लगता है कि 'गलत' है।

+0

hypothetically, eval यह कर सकता है ... –

+2

@ Šime Vidas, लेकिन व्यावहारिक रूप से, eval हर हालत में बचा जाना चाहिए: डी –

+0

@Gabi, मैं मानता हूँ कि 'eval()' नहीं सही समाधान यहाँ है, लेकिन मैं मैं उत्सुक हूं कि आप क्यों कहते हैं कि "सभी लागतों पर eval से बचा जाना चाहिए"। यह उचित (और अनुचित) उपयोगों के साथ भाषा की एक गैर-बहिष्कृत विशेषता है - बस हर दूसरी सुविधा की तरह। – Lee

उत्तर

17
function getTool(name){ 
    return (typeof window[name] === 'function') ? 
            new window[name]() : {/*some default*/}; 
} 

मान लिया गया PointerTool निर्माता वैश्विक window नाम स्थान में परिभाषित किया गया है। उस स्थान को बदलें जिसे आप उपयोग कर रहे हैं।

+1

यदि आप Node.js का उपयोग कर रहे हैं तो आप एक ही चीज़ करने के लिए ग्लोबल ऑब्जेक्ट का उपयोग कर सकते हैं। –

+0

मैं अभी इस समाधान के साथ जाऊंगा, कुल मिलाकर भूल गया कि _everything_ एक फ़ंक्शन है, इस प्रकार वैश्विक 'विंडो' ऑब्जेक्ट/फ़ंक्शंस/नेमस्पेस भी :) – Dribbel

+0

@Dribbel - अच्छा लगता है। मैंने केवल 'विंडो' का उपयोग किया क्योंकि मैं नामस्थान का निश्चित नहीं था। यदि आप 'विंडो' का उपयोग कर रहे हैं तो मैं उन्हें किसी अन्य नामस्थान में परिभाषित करने की अनुशंसा करता हूं। एक ही तकनीक का उपयोग किया जा सकता है, लेकिन यदि 'getTool' कुछ और नहीं कर रहा है, तो आप उस फ़ंक्शन कॉल को खत्म कर सकते हैं। – user113716

8

आपको अपने दृष्टिकोण पर पुनर्विचार करने पर विचार करना चाहिए। बेहतर होगा एक Tools वस्तु है, जो गुण के रूप में उपकरणों के लिए होता है की तरह कुछ, जैसे

Tools = {"SelectTool": SelectTool /* etc */}`. 

इस तरह है करने के लिए हैं, तो आप टूल तक पहुंच सकता है दोनों new Tools.SelectTool और new Tools[var_with_tool_name] के रूप में।

+0

यह पैट्रिक के दृष्टिकोण की तुलना में मेरे लिए अधिक जटिल लग रहा है। –

+2

हां, लेकिन यह तब भी काम करता है जब उपकरण अलग-अलग नामस्थानों में हों। –

3

आपके उदाहरण में, आप वैश्विक दायरे में एक समारोह के रूप में PointerTool घोषित कर रहे हैं। मान लें कि आपका जावास्क्रिप्ट ब्राउजर चला रहा है, "ग्लोबल स्कोप" वास्तव मेंwindow ऑब्जेक्ट जैसा ही है। इसका मतलब है कि अगर आप एक निर्माता है:

function PointerTool() { 
    ... 
} 

है कि इस तरह ही है: तो अब

window.PointerTool = function() { 
    ... 
} 

, अपने getTool समारोह में आप इस तरह अपने निर्माता कार्यों का उपयोग कर सकते हैं:

function getTool(name){ 
    return new window[name](); 
} 

यह करने के लिए अपने स्वयं के नाम स्थान वस्तु को परिभाषित करने के लिए किया जाएगा एक और अधिक "भविष्य सबूत" जिस तरह से है, जिसमें आप करेंगे pla अपने सभी विभिन्न उपकरण रचनाकारों को सीईओ। कुछ इस तरह ("MyProject" अपनी परियोजना या सिस्टम की कमी नाम होगा):

var myproject = { tools: {} }; 

// Pointer Tool Constructor 
myproject.tools.PointerTool = function() { 
    ... 
} 

// Line Tool Constructor 
myproject.tools.LineTool = function() { 
    ... 
} 

// and so on 

फिर अपने getTool समारोह इस प्रकार दिखाई देगा:

function getTool(name){ 
    return new myproject.tools[name](); 
} 

यह दृष्टिकोण अपना सामान से अलग रहता है जो कुछ भी अन्य सामान वैश्विक/खिड़की के दायरे में परिभाषित किया जाता है।

+0

नहीं, 'फ़ंक्शन पॉइंटरटूल' ≠ 'window.PointerTool = function': पहला एक फ़ंक्शन * घोषणा * है, दूसरा फ़ंक्शन * अभिव्यक्ति *। http://kangax.github.com/nfe/#expr-vs-decl –

+0

सच है, लेकिन इस प्रश्न के संदर्भ में, यह पर्याप्त बराबर है। यही है, आप 'pointerTool' का उपयोग करके 'window.PointerTool' का उपयोग करके संदर्भित कर सकते हैं, जो इस उत्तर का बिंदु है। – MooGoo

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

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