मैंने अभी जावास्क्रिप्ट में ओओपी का उपयोग करना शुरू किया है और मैं किसी अन्य विधि के अंदर से एक विधि को प्राप्त करने की कोशिश कर रहे कुछ समस्याओं में भाग गया।
यहाँ मेरे पास कोड है:
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);
}
}
2 जवाब
जब आप ऐसा करते हैं:
setTimeout(this.update, 10);
जो आपके "अपडेट" फ़ंक्शन के संदर्भ को सिस्टम में सही ढंग से करता है, लेकिन जब ब्राउज़र वास्तव में बाद में फ़ंक्शन को कॉल करता है, तो उसे पता नहीं चलेगा कि this
क्या होना चाहिए। इसके बजाय आप क्या कर सकते हैं निम्नलिखित है:
var me = this;
setTimeout(function() { me.update(); }, 10);
यह सुनिश्चित करेगा कि जब "अपडेट" कहा जाता है, तो इसे this
आपके ऑब्जेक्ट के संदर्भ के रूप में सही ढंग से सेट किया जाएगा।
कुछ अन्य भाषाओं के विपरीत, यह तथ्य कि किसी फ़ंक्शन को प्रारंभ में किसी ऑब्जेक्ट की एक संपत्ति के रूप में परिभाषित किया जाता है, उस फ़ंक्शन को आंतरिक रूप से उस ऑब्जेक्ट से नहीं बांधता है। उसी तरह यदि आपके पास एक संपत्ति वाली वस्तु थी जो एक साधारण संख्या है:
maxLength: 25,
अच्छी तरह से मूल्य "25" का विशेष रूप से वस्तु से कोई लेना-देना नहीं होगा; यह सिर्फ एक मूल्य है। जावास्क्रिप्ट में, फ़ंक्शन केवल मान भी होते हैं। इस प्रकार यह सुनिश्चित करने के लिए प्रोग्रामर पर निर्भर है कि जब भी किसी फ़ंक्शन को किसी "विशेष" तरीके से बुलाया जाता है तो this
को कुछ उपयुक्त पर सेट किया जाएगा।
आप समस्या यह है कि आप तत्काल वस्तु के बजाय वस्तु का शाब्दिक उपयोग करते हैं
इसके बजाय इसे इस तरह से करने का प्रयास करें:
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();
this
के लिए वास्तव में एक अच्छा संदर्भ: bonsaden.github.com/JavaScript- बगीचा/#कार्यक्रम.यह