मैंने अभी जावास्क्रिप्ट में ओओपी का उपयोग करना शुरू किया है और मैं किसी अन्य विधि के अंदर से एक विधि को प्राप्त करने की कोशिश कर रहे कुछ समस्याओं में भाग गया।

यहाँ मेरे पास कोड है:

var Game = {
initialize: function () {
    if (canvas.isSupported()) {
        sprites[0] = new Player();

        this.update();
    }
},

update: function() {
    for (var i = 0; i < sprites.length; i++) {
        sprites[i].update();
    }

    this.draw();
},

draw: function() {
    this.clear();

    for (var i = 0; i < sprites.length; i++) {
        sprites[i].draw();
    }

    setTimeout(this.update, 10);
},

clear: function() {
    canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}

}

लेकिन Game.update() को कॉल करना एक त्रुटि देता है कि ड्रा विधि परिभाषित नहीं है। मुझे इसका कोई वास्तविक समाधान नहीं मिला। अंततः मुझे यह मिला /ए> जहां उत्तर ऐसा प्रतीत होता है कि मुझे इस संदर्भ को सुरक्षित करने की आवश्यकता है जैसे: var _this = this; लेकिन मैं इसे शाब्दिक संकेतन में काम करने के लिए नहीं मिला, इसलिए मैंने कोड को ऑब्जेक्ट कन्स्ट्रक्टर में बदल दिया (मुझे लगता है कि इसे कैसे कहा जाता है) और चर जोड़ा।

मैं फिर बदल गया

this.draw();

प्रति

_this.draw();

और यह काम किया।

हालांकि

this.clear();

और यह अद्यतन() अभी भी वही हैं, वे पहली जगह में त्रुटियां नहीं देते थे।

क्या कोई समझा सकता है कि ऐसा क्यों है? और शायद मुझे एक बेहतर समाधान के लिए इंगित करें? अग्रिम में धन्यवाद।

अपडेट करें

यहाँ यह क्या होना चाहिए:

var Game = function () {
var _this = this;

this.initialize = function () {
    if (canvas.isSupported()) {
        sprites[0] = new Player();

        this.update();
    }
}

this.update = function () {
    for (var i = 0; i < sprites.length; i++) {
        sprites[i].update();
    }

    this.draw();
}

this.draw = function () {
    this.clear();

    for (var i = 0; i < sprites.length; i++) {
        sprites[i].draw();
    }


    setTimeout(function () { _this.update(); }, 10);
}

this.clear = function () {
    canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}

}

10
Restart 17 मार्च 2011, 16:26
क्या आप पूरा कोड दिखा सकते हैं जो काम करता है?
 – 
Matt Ball
17 मार्च 2011, 16:30
3
शानदार होने और अपना अपडेट पोस्ट करने के लिए +1। इस पोस्ट ने अंततः वैकल्पिक नेमस्पेसिंग विधियों में अंतर को समेकित किया। आपने आज मुझे एक बेहतर कोडर बना दिया। :)
 – 
dano
16 नवम्बर 2012, 10:26

2 जवाब

सबसे बढ़िया उत्तर

जब आप ऐसा करते हैं:

setTimeout(this.update, 10);

जो आपके "अपडेट" फ़ंक्शन के संदर्भ को सिस्टम में सही ढंग से करता है, लेकिन जब ब्राउज़र वास्तव में बाद में फ़ंक्शन को कॉल करता है, तो उसे पता नहीं चलेगा कि this क्या होना चाहिए। इसके बजाय आप क्या कर सकते हैं निम्नलिखित है:

var me = this;
setTimeout(function() { me.update(); }, 10);

यह सुनिश्चित करेगा कि जब "अपडेट" कहा जाता है, तो इसे this आपके ऑब्जेक्ट के संदर्भ के रूप में सही ढंग से सेट किया जाएगा।

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

   maxLength: 25,

अच्छी तरह से मूल्य "25" का विशेष रूप से वस्तु से कोई लेना-देना नहीं होगा; यह सिर्फ एक मूल्य है। जावास्क्रिप्ट में, फ़ंक्शन केवल मान भी होते हैं। इस प्रकार यह सुनिश्चित करने के लिए प्रोग्रामर पर निर्भर है कि जब भी किसी फ़ंक्शन को किसी "विशेष" तरीके से बुलाया जाता है तो this को कुछ उपयुक्त पर सेट किया जाएगा।

14
Pointy 17 मार्च 2011, 16:48
उम्म, इसके लिए खेद है। मैं आपको वोट करके याद नहीं कर सकता। यह एक गलत क्लिक रहा होगा।
 – 
RoToRa
18 मार्च 2011, 16:45
यह आप नहीं रहे होंगे, @RoToRa - यह शायद एक रहस्य बना रहेगा :-)
 – 
Pointy
18 मार्च 2011, 16:48
वैसे मेरा डाउन वोट तीर नारंगी था, तो शायद यह मैं था। मुझे याद नहीं है कि आपका जवाब पसंद नहीं आया :-)
 – 
RoToRa
18 मार्च 2011, 16:56

आप समस्या यह है कि आप तत्काल वस्तु के बजाय वस्तु का शाब्दिक उपयोग करते हैं

इसके बजाय इसे इस तरह से करने का प्रयास करें:

var Game = function() {
  this.initialize = function () {
    if (canvas.isSupported()) {
      sprites[0] = new Player();
      this.update();
    }
  };
  this.update = function() {
    for (var i = 0; i < sprites.length; i++) {
        sprites[i].update();
    }

    this.draw();
  };

  this.draw = function() {
    this.clear();

    for (var i = 0; i < sprites.length; i++) {
        sprites[i].draw();
    }

    setTimeout(this.update, 10);
  };

  this.clear = function() {
    canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
  };
}

अब उपयोग करें:

 var myGame = new Game();
0
Martin Jespersen 17 मार्च 2011, 16:34
2
this के लिए वास्तव में एक अच्छा संदर्भ: bonsaden.github.com/JavaScript- बगीचा/#कार्यक्रम.यह
 – 
Adrian Pacala
17 मार्च 2011, 16:33
1
@ पॉइंटी: सच है, सेटटाइमआउट विफल होने के लिए बाध्य है, लेकिन ऐसा लगता है कि आप इसे कवर कर रहे हैं :)
 – 
Martin Jespersen
17 मार्च 2011, 16:36
मैं मानता हूं कि आगे बढ़ना और उस तरह के एक निर्माता के साथ ऐसा करना शायद बेहतर है।
 – 
Pointy
17 मार्च 2011, 16:38