हां, यह एक प्रारंभिक मुद्दा है। this
उस बिंदु पर आपके SizeManager
ऑब्जेक्ट का संदर्भ नहीं देता है जिसका आप उपयोग कर रहे हैं। (ऑब्जेक्ट प्रारंभकर्ता this
के मान को नहीं बदलते हैं।) this
यह निर्धारित करता है कि आप फ़ंक्शन को कैसे कॉल करते हैं और उस फ़ंक्शन कॉल में वही मान होता है। आप पर कोई फ़ंक्शन नहीं डाल रहे हैं, इसलिए this
में उस कोड की शुरुआत से पहले जो भी मूल्य था, वह है।
(मैं इस के अंत में अपने विशिष्ट उदाहरण से इस बारे में कुछ ratio
ने बताया है, लेकिन पहले के सामान्य मामले आप को बढ़ाने के लिए कुछ विकल्प के माध्यम से चलना करते हैं।)
Daniel's given you बनाने पर एक अच्छा स्टीयर ratio
एक फ़ंक्शन को छोड़कर ऐसा लगता है कि आप चौड़ाई को बदलना नहीं चाहते हैं। या फिर, यदि width
और height
बदलने के लिए नहीं जा रहे हैं, बस इसे बाद में गणना:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
}
};
SizeManager.ratio = SizeManager.width/SizeManager.height;
(साइड नोट: मैं गुण आप resize
में संदर्भित कर रहे हैं करने के लिए this.
जोड़ दिया है वे अपने मूल से लापता हैं। ।, लेकिन वे आवश्यक उनके बिना, आप horror of implicit globals है, जो एक बुरा बात (टीएम) साथ काम कर रहे हैं)
बेशक
, आप एक कारखाने में है, उन सभी को संपुटित सकता है:।
function makeSizeManager(width, height) {
return {
width : width,
height : height,
ratio : width/height,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
}
};
}
var SizeManager = makeSizeManager(800, 600);
... लेकिन फिर आप के रूप में अच्छी ताकि आप डुप्लिकेट (लेकिन समान) के बहुत सारे नहीं बनाते हैं यह एक वास्तविक निर्माता समारोह बना सकता है resize
कार्य:
function SizeManager(width, height) {
this.width = width;
this.height = height;
this.ratio = width/height;
}
SizeManager.prototype.resize = function (newWidth) {
this.width = newWidth;
this.height = newWidth/this.ratio;
};
var aSizeManagerInstance = new SizeManager(800, 600);
(ध्यान दें मैं थोड़ा पर नाम बदल यह आखिरी वाला)
और एक आखिरी अंतिम नोट के रूप में: अपने विशिष्ट उदाहरण में, आप वास्तव में सब पर ratio
स्टोर करने के लिए की जरूरत नहीं है, तो आप ऐसा कर सकते हैं:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
var ratio = this.width/this.height;
this.width = newWidth;
this.height = newWidth/ratio;
}
};
लेकिन वह सिर्फ इतना है कि विशिष्ट उदाहरण के लिए है, इसलिए सामान्य मामले के बारे में बात करने के लिए ऊपर चर्चा।
यदि आप किसी ऑब्जेक्ट से किसी फ़ंक्शन में इसे बदल रहे हैं, तो आपको गुण निर्दिष्ट करने के तरीके को बदलने की आवश्यकता है (कोड के तीसरे ब्लॉक में)। अर्थात। 'this.width = width' की बजाय' width: width' –
@ Daniel: धन्यवाद! ऐसा लगता है कि पेस्ट करने के बाद मैंने केवल उन पंक्तियों को आधा संपादित किया था। फिक्स्ड। –