2017-12-18 67 views
7

में निर्दिष्ट मैं की तरह एक वर्ग पदानुक्रम है वर्ग के नाम की वस्तु बनाने:Node.js चर

   |-> Square 
AbstractShape -+-> Circle 
       |-> Triangle 

अब, मैं रणनीति पैटर्न को लागू करने और वर्ग है कि स्ट्रिंग में संग्रह किया गया है की एक वस्तु बनाने के लिए करना चाहते हैं। PHP में मैं उपयोग करता हूं:

$type = 'Square'; 
$obj = new $type(); 

क्या Node.js में समतुल्य है?

+0

इसे 'नया स्क्वायर() ' – zabusa

उत्तर

4

आप एक और अधिक मजबूत और परीक्षण योग्य दृष्टिकोण के साथ जाने के लिए, आप कर सकते थे इच्छुक रहे हैं ऑब्जेक्ट जारी करने के लिए कक्षाओं और फैक्ट्री पैटर्न के संयोजन का उपयोग करें। निम्नलिखित देखें, आप देखेंगे कि इस सेटअप के साथ, अधिक ग्रेन्युलर तर्क और सड़क के नीचे परीक्षण करना आसान हो जाएगा और आपको अधिक लचीलापन मिल जाएगा। आप ऑब्जेक्ट को .issue कॉल के पीछे ऑब्जेक्ट को दूर करने के लिए भी सारण कर रहे हैं - जो कुछ मामलों में फायदेमंद और सुविधाजनक हो सकता है।

मैं यह भी ध्यान देता हूं कि आप अपनी PHP पृष्ठभूमि का उल्लेख करते हैं, इसलिए मैं यह भी दिखा रहा हूं कि ईएस 6 में ऑब्जेक्ट उन्मुख दृष्टिकोण कैसे लिया जा सकता है।

class AbstractShape { 
    constructor(type) { 
    this.type = type; 
    } 

    getType() { 
    console.log(`I am a ${this.type}`); 
    } 
} 

class Square extends AbstractShape { 
    constructor(type) { 
    super(type); 
    this.sides = 4; 
    } 

    getDescription() { 
    console.log(`I have ${this.sides} equal sides`); 
    } 
} 

class ShapeFactory { 
    static issue(type) { 
    switch(type) { 
     case 'Square': return new Square(type); 
     break; 
     case 'Circle': /* same pattern with a Circle class */ 
     break; 
    } 
    } 
} 

let shape = ShapeFactory.issue('Square'); 

shape.getType();  /* I am a Square */ 
shape.getDescription(); /* I have 4 equal sides */ 

JSFiddle Link - डेमो


इसके अलावा, आप कुछ अनावश्यक तार जैसे के साथ काम की तुलना में थोड़ा अधिक दोष सहिष्णु चाहते हैं तो 'Square' - there are some creative ways enum-like दृष्टिकोण का लाभ उठाने के लिए जो इसे और भी परिष्कृत कर सकता है। मैं यहां अचल संपत्ति को बचाऊंगा और कोड स्निपेट को फिर से नहीं रखूंगा, लेकिन आपके लिए जांच करने के लिए एक पहेली शामिल होगी।

JSFiddle Link - enum दृष्टिकोण डेमो

2
  1. त्वरित और गंदे तरीके eval का उपयोग करना है। लेकिन यह दृढ़ता से क्योंकि कई कारणों में से अनुशंसित नहीं है - सुरक्षा, प्रदर्शन, पठनीयता, supportability

    function MyType() { 
    } 
    
    var typeName = 'MyType'; 
    var typeObj = eval('new ' + typeName + '()'); 
    
  2. अधिक सुरक्षित और अधिक सही से eval प्रकार के लिए स्ट्रिंग नामों की मैपिंग का उपयोग करने के लिए है (@GaloisGecko करने के लिए धन्यवाद)

    function createType(name) { 
        var types = { 
        "Square": Square, 
        "Circle": Circle, 
        "Triangle": Tringle 
        }; 
        return types.hasOwnProperty(name) ? new types[name]() : null; 
    } 
    
  3. अंत में, फैक्टरी पैटर्न लागू करने का सबसे अच्छा और बुद्धिमान निर्णय है। @scniro answer देखें। इसके अलावा, आप अच्छा वर्णन और उदाहरण here

+0

कॉल करने जैसा है, जब भी संभव हो' eval' का उपयोग न करें। और यहां आपको इसकी आवश्यकता नहीं है, इसलिए इस समाधान से दूर रहें। –

4

एक सुरक्षित तरीका एक कारखाने वस्तु को परिभाषित किया जाएगा पा सकते हैं:

function Square() { 
} 

// here other constructors for Circle and Triangle 

var factory = { 
    "Square": Square, 
    "Circle": Circle, 
    "Triangle" : Triangle 
} 

var typeName; 

// here some code which sets typeName 

var typeObj = new factory[typeName](); 
1
करीब विचार करने पर

काफी आसान तरीका Node.js. लिए चारों ओर है जब आप किसी ऑब्जेक्ट को सरल तरीके से तत्काल तरीके से प्रारंभ करते हैं तो आप वास्तव में new <variableName> लिखते हैं जहां variableName कुछ मॉड्यूल में परिभाषित और निर्यात किए गए कुछ फ़ंक्शन या क्लास का एक निकाय है। require() इसे परिवर्तनीय करने के लिए इस फ़ंक्शन/क्लास को असाइन करने के लिए।

const type = 'Square'; 
const shape = require(`${pathToShapeModules}/${type}.js`); 
const aShape = new shape(); 

माइनर नकारात्मक पक्ष यह है कि eslint शिकायत है (कुछ नियम सेटिंग्स में) कि require रों के शीर्ष पर रखा जा करने के लिए कर रहे हैं:

तो,

const type = 'Square'; 
const aSquare = new type(); 

के बजाय आप लिखने की ज़रूरत मॉड्यूल। और निश्चित रूप से इसे प्रयास करें ... पकड़ आदि द्वारा उचित अपवाद हैंडलिंग की आवश्यकता है इसलिए शायद फैक्टरी समाधान बेहतर है (इसलिए मैं इसे स्वीकार करने जा रहा हूं) लेकिन मुझे लगता है कि छोटे विशेष मामलों के लिए यह समाधान ठीक है।