2009-12-31 22 views
6

बस किक्स के लिए मैं जावास्क्रिप्ट में एक साधारण डेटा ऑब्जेक्ट बनाने की कोशिश कर रहा हूं। कोड यहाँ है।जावास्क्रिप्ट में ऑब्जेक्ट क्रिएशन

var roverObject = function(){ 

     var newRover = {}; 
     var name; 
     var xCord; 
     var ycord; 
     var direction; 

     newRover.setName = function(newName) { 
      name = newName; 
     }; 

     newRover.getName = function() { 
      return name; 
     }; 

     newRover.setDirection = function(newDirection) { 
      direction = newDirection; 
     }; 

     newRover.getDirection = function() { 
      return direction; 
     }; 

     newRover.setXCord = function(newXCord) { 
      xCord = newXCord; 
     }; 

     newRover.getXCord = function() { 
      return xCord; 
     }; 

     newRover.setYCord = function(newYCord) { 
      yCord = newYCord; 
     }; 

     newRover.getYCord = function() { 
      return yCord; 
     }; 

     newRover.where = function(){ 
      return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction; 
     }; 

     return newRover; 
    }; 


    rover1 = new roverObject(); 
    rover2 = new roverObject();  

    rover1.setName("Mars Rover"); 
    rover1.setDirection("NORTH"); 
    rover1.setXCord(2); 
    rover1.setYCord(2); 
    console.log(rover1.where()); 
    console.log(rover1); 

    rover2.setName("Moon Rover"); 
    rover2.setDirection("SOUTH");  
    rover2.setXCord(1); 
    rover2.setYCord(1);  
    console.log(rover2.where());   
    console.log(rover2); 

मेरे पास इस सृजन के आसपास कुछ प्रश्न हैं।

  1. मैं ऐसी वस्तु बनाना चाहता हूं जहां वस्तु के गुण/गुण निजी हैं और दुनिया के लिए दृश्यमान नहीं हैं। क्या मैं ऐसा करने में सफल हूं? क्या मैं वास्तव में ऑब्जेक्ट विशेषताओं तक नहीं पहुंच सकता?
  2. वहाँ वस्तु के इस प्रकार बनाने के लिए एक बेहतर तरीका है?
  3. अगर मैं इस ऑब्जेक्ट का उत्तराधिकारी बनाना चाहता हूं, तो मुझे newObject.prototype = roverObject करना चाहिए जो काम करेगा? और यह सब कुछ समझ में आता है।
  4. अंत में मुझे एक कठोर समस्या है। Objet "where" की आखिरी विधि पर ध्यान दें जो एक समेकित स्ट्रिंग देता है। यहां मैंने इसके बजाय कोड का पालन करने की कोशिश की।

    cannot access optimized closure 
    

    यह है कि क्यों कहेंगे:

     newRover.where = function(){ 
         return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction; 
        }(); 
    

और फिर मेरे लिए एक निम्नलिखित console.log

console.log(rover1.where); 
console.log(rover2.where); 

यह निम्न फेंक दिया त्रुटि किया था? मैं क्या गलत कर रहा हूं?

सभी मदद के लिए धन्यवाद। किसी भी समीक्षा टिप्पणी की भी सराहना की जाएगी! चीयर्स

+2

'वर newRover पर अर्धविराम भूल = {}' और अपने सभी समारोह परिभाषा पर। – philfreo

+0

धन्यवाद। वह बदलाव करेगा। :) – Priyank

+0

जोड़ने अर्धविराम अभी भी समस्या का समाधान नहीं होगा हालांकि निश्चित रूप से – Priyank

उत्तर

6

क्या मैं ऐसा करने में सफल हूं? क्या मैं वास्तव में ऑब्जेक्ट विशेषताओं तक नहीं पहुंच सकता?

दरअसल। आपके पास ऑब्जेक्ट विशेषताएँ नहीं हैं, आपके पास roverObject फ़ंक्शन में स्थानीय चर हैं। स्थानीय चर को बाहर से नहीं पहुंचा जा सकता है, केवल roverObject फ़ंक्शन के अंदर के फ़ंक्शंस से जो उनके ऊपर बंद हो।

कि आप roverObject को new roverObject के साथ एक निर्माता के रूप में बुला रहे हैं, अप्रासंगिक है, क्योंकि आप फ़ंक्शन से एक अलग ऑब्जेक्ट लौट रहे हैं। के बिना var rover1= roverObject() कहकर बिल्कुल वही काम करेगा।विशेष रूप से वस्तु [new] roverObject द्वारा लौटाए गए एक सादे Object के रूप में आप यह {} से बनाए गए है, rover1 instanceof roverObjectfalse है।

यदि आप instanceof चाहता था काम करने के लिए, आप new साथ कॉल करने के लिए है, और निर्माता समारोह में this बजाय newRover का उपयोग करें।

मैं इस वस्तु के वारिस चाहते हैं, मुझे क्या करना चाहिए एक newObject.prototype = roverObject कि काम करेगा? और यह सब कुछ समझ में आता है।

नहीं। आप वर्तमान में प्रोटोटाइप के लिए कोई भत्ता की है। आप roverObject के प्रत्येक उदाहरण के लिए प्रत्येक विधि की एक अलग प्रतिलिपि का उपयोग कर रहे हैं। आप निश्चित रूप से इस तरह से वस्तुओं को कर सकते हैं लेकिन प्रोटोटाइप की तुलना में यह एक अलग दृष्टिकोण है। वास्तव में आधार वर्ग निर्माता में 'निजी' स्थानीय चर के बाद से

function AdvancedRover() { 
    var rover= new roverObject(); 
    rover.doResearch= function() { 
     return rover.where()+' and is doing advanced research'; 
    }; 
    return rover; 
} 

नोट निजी होते हैं, यहां तक ​​कि: आप व्यवस्था आप अब में roverObject का एक उपवर्ग की तरह कुछ करना चाहता था, तो आप की तरह कुछ कहेंगे उपclass उन पर नहीं मिल सकता है। कोई 'संरक्षित' नहीं है।

newRover.where = function() {...}();

कि क्या करें कोशिश कर रहा है? मुझे आपके द्वारा की गई त्रुटि नहीं मिल सकती है; उपरोक्त सभी स्ट्रिंग को where पर स्थान के साथ स्ट्रिंग असाइन करता है (सेटटर विधियों को कॉल करने से पहले, इसलिए यह अनिर्धारित है)।

क्या इस तरह की वस्तु बनाने का कोई बेहतर तरीका है?

शायद। जावास्क्रिप्ट में वर्ग/उदाहरण रणनीतियों का एक चर्चा के लिए this question देखते हैं।

+0

उत्कृष्ट सूचक! इसने बहुत सारी जानकारी प्रदान की। धन्यवाद – Priyank

1

4 के संबंध में - आप फ़ंक्शन को कॉल करने का नतीजा नहीं, फ़ंक्शन लॉग करने का प्रयास कर रहे हैं। होना चाहिए console.log(rover1.where()); मेरा अनुमान है फ़ायरबग (मुझे लगता है यह फ़ायरबग के console.log है) समारोह परिभाषाओं लॉग इन करने की पसंद नहीं है।

संपादित करें ओह मुझे मिल गया है, जब आप rover.where असाइन करते हैं तो आप वास्तव में कहां मजाक कर रहे हैं। क्या आप वास्तव में एक समारोह होने के लिए संपत्ति की तरह दिखने की कोशिश कर रहे हैं? अगर ऐसा है तो यह काम नहीं करेगा। यदि आप इसे कॉल करते समय मूल्यांकन करना चाहते हैं तो इसे एक समारोह होना होगा।

आपके मामले में क्या होता है where कन्स्ट्रक्टर फ़ंक्शन में निष्पादित हो जाता है। उस समय आप अभी भी roverObject बंद पैदा कर रहे हैं और इसलिए यह यह निजी चर है तक पहुँचने के लिए बहुत जल्दी है।

+0

वह काम नहीं करता। मुझे यकीन है, अगर ऐसा लगता है कि मेरा बंद करने का कार्य फ़ंक्शन का मान देता है, जहां फ़ंक्शन के बजाय, तो एक विशेषता सही कहां बन जाती है? एक समारोह नहीं – Priyank

+0

सही - लेकिन जब आप 'console.log (rover1.where) 'को कॉल करते हैं, तो आप फ़ंक्शन परिभाषा को मुद्रित करने का प्रयास कर रहे हैं, जो मुझे लगता है कि फ़ायरबग नहीं कर सकता (इस मामले में) –

+0

संपादन देखें, मुझे नया एहसास नहीं हुआ 'कहां' समारोह के लिए वाक्यविन्यास :) –

0

यह सिर्फ अपनी पोस्ट के बिंदु 1 संबोधित कर रहा है।

यहाँ एक अच्छा लेख है जावास्क्रिप्ट पर निजी सदस्यों और अधिक:
Private Members in JavaScript

2

Q1: आप जावास्क्रिप्ट 'वर्गों' में 'निजी' के सदस्यों को बना सकते हैं। जावास्क्रिप्ट में, गोपनीयता किसी भी एक्सेस विनिर्देशक द्वारा निर्धारित नहीं है। इसके बजाय, एक्सेस को विशेष रूप से वाद्य यंत्रों की आवश्यकता होती है। उदाहरण:

function MyClass() { 
    this.val = 100; // public; 
    var privateVal = 200; 

    function getVal() { return this.val; } // private method; 
    this.getPrivateVal = function() { // public method, accessor to private variable 
     return privateVal; 
    } 
} 

जावास्क्रिप्ट में ऑब्जेक्ट स्कोप बंद करने वाले क्वियर अवधारणा द्वारा शासित है। AFAIK, वहाँ सी की तरह किसी भी अन्य लोकप्रिय launguage में कोई समानांतर अवधारणा +/जावा आदि

जबकि मैं समझता हूँ कि क्या बंद कर रहे हैं, मैं इसे शब्दों में डाल सकते हैं। अब

function closureDemo() { 
    var done=false; 
    function setDone() { done=true; } 
    doLater(setDone); 
} 

function doLater(func) { setTimeout(func,1000); } 

closureDemo(); 

, setDone doLater के भीतर से कहा जाता है, जबकि, यह अभी भी closureDemo में done उपयोग कर सकते हैं, भले ही done दायरे में नहीं है (पारंपरिक प्रक्रियात्मक अर्थ में): शायद एक प्रदर्शन आप में मदद मिलेगी।

मुझे लगता है कि आप और अधिक समझ जाएगा जब आप this पढ़ें।


प्रश्न 2: मैं केवल यही कह सकता हूं कि मैं क्या करता हूं; मुझे नहीं पता कि यह बेहतर है या नहीं। अगर मैं अपने कोड लिखा है, इसे इस तरह दिखेगा: नोट करने के लिए

function RoverObject() { 

    var newRover = {}; // privates 
    var name; 
    var xCord; 
    var ycord; 
    var direction; 

    this.setName = function(newName) { 
     name = newName; 
    }; 

    this.getName = function() { 
     return name; 
    }; 

    this.setDirection = function(newDirection) { 
     direction = newDirection; 
    }; 

    // and so on... 

    this.where = function(){ 
     return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction; 
    }; 
} 
var rover1 = new RoverObject(); 

अंक: "वर्ग के नाम" के पहले अक्षर

  • इस के बजाय का उपयोग की

    1. पूंजीकरण roverObject
    2. यह फ़ंक्शन एक शुद्ध कन्स्ट्रक्टर है। यह कुछ भी नहीं देता है।

    Q3: अगर आप विरासत करना चाहते हैं, तो अपने विधि (इस का उपयोग करते हैं) काम नहीं करेगा। इसके बजाय, सार्वजनिक तरीकों RoverObject की prototype का एक हिस्सा होना चाहिए। this पढ़ें। उत्कृष्ट सामग्री

    उम्मीद है कि मदद करता है।


    संपादित करें: जिस तरह से अपने कोड काम कर रहा है के साथ एक समस्या है। समस्याएं:

    1. आपका फ़ंक्शन ऐसा नहीं करता जो उसका नाम सुझाता है। इसका नाम createRoverObject बेहतर था, क्योंकि यह वही है जो यह कर रहा है। यह एक वर्ग निर्माता की तरह काम नहीं कर रहा
    2. अपने वर्ग द्वारा समर्थित तरीकों वस्तु का हिस्सा हैं, लेकिन डेटा के सदस्य नहीं हैं। हालांकि यह काम कर सकता है (और ऐसा नहीं है, क्योंकि आपकी console.log() समस्या बताती है), यह जावास्क्रिप्ट में कक्षा को लागू करने का एक अच्छा तरीका नहीं है। यहां समस्या बंद होने का है। दोबारा, मैं स्पष्ट रूप से समस्या को स्पष्ट करने में असमर्थ हूं, लेकिन मैं smell it कर सकता हूं।
  • 0

    अपने वस्तु को परिभाषित की तरह इस आप निजी सदस्यों देता है।

    function RolloverObject() { 
        var name; 
        var xCord; 
        var ycord; 
        var direction; 
    
        this.setName = function(newName) { name = newName; }; 
        this.getName = function() { return name; }; 
    
        this.setDirection = function(newDirection) { direction = newDirection; }; 
        this.getDirection = function() { return direction; }; 
    
        this.setXCord = function(newXCord) { xCord = newXCord; }; 
        this.getXCord = function() { return xCord; }; 
    
        this.setYCord = function(newYCord) { yCord = newYCord; }; 
        this.getYCord = function() { return yCord; }; 
    
        this.where = function() { 
         return "Rover :: " + name + " is at Location(" + xCord + "," + yCord + ") pointing to " + direction; 
        }; 
    } 
    
    var rolloverObject = new RolloverObject(); 
    
    संबंधित मुद्दे