दिलचस्प पोस्ट
इस WCF त्रुटि का क्या अर्थ है: "कस्टम टूल चेतावनी: wsdl आयात नहीं किया जा सकता: portType" हॉटस्पॉट जेवीएम में कम्प्रेश्ड स्ट्रिंग्स का समर्थन किया जा रहा है? जावास्क्रिप्ट .प्रोटोटाइप कैसे काम करता है? एक MySQL तालिका पर डुप्लिकेट को कैसे हटाएं? AVCapture सत्र और पृष्ठभूमि ऑडियो आईओएस 7 ब्राउज़र टाइमआउट कैसे regex समूहों के साथ एकाधिक घटनाओं को खोजने के लिए? किसी फ़ोल्डर या जार से रनटाइम पर कक्षाएं कैसे लोड करें? एसक्यूएल में दो तिथियों के बीच पूर्ण महीने की संख्या की गणना करना IPhone पर इंस्टॉल किए गए ऐप्स की सूची प्राप्त करें कैसे टॉमकेट पर सीडीआई स्थापित और उपयोग करें? Regex में \ b और \ B के बीच अंतर AngularJS संसाधन वादा ऑफ़लाइन उपयोग के लिए Google मानचित्र टाइल कैश कैसे करें? सी # – असेंबल लोड करने का सही तरीका, क्लास और कॉल रन () विधि खोजें

जावास्क्रिप्ट: ऑपरेटर ओवरलोडिंग

मैं कुछ दिनों के लिए जावास्क्रिप्ट के साथ काम कर रहा हूं और मुझे एक निश्चित बिंदु पर मिल गया है जहां मैं अपनी परिभाषित ऑब्जेक्ट्स के लिए ऑपरेटरों को ओवरलोड करना चाहता हूं।

इसके लिए गूगल की खोज के कार्यकाल के बाद ऐसा लगता है कि आप आधिकारिक तौर पर ऐसा नहीं कर सकते हैं, फिर भी वहाँ कुछ लोग इस कार्रवाई के निष्पादन के कुछ लंबे समय से चलने वाले तरीके का दावा कर रहे हैं।

असल में मैंने एक वेक्टर 2 वर्ग बनाया है और निम्न कार्य करने में सक्षम होना चाहता हूँ:

var x = new Vector2(10,10); var y = new Vector2(10,10); x += y; //This does not result in x being a vector with 20,20 as its x & y values. 

इसके बजाय मुझे यह करना है:

 var x = new Vector2(10,10); var y = new Vector2(10,10); x = x.add(y); //This results in x being a vector with 20,20 as its x & y values. 

क्या कोई दृष्टिकोण है जो मैं अपने वेक्टर 2 वर्ग में ओवरलोड ऑपरेटर ले सकता हूं? जैसा कि यह सिर्फ सादे बदसूरत लग रहा है

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट: ऑपरेटर ओवरलोडिंग"

जैसा कि आपने पाया है, जावास्क्रिप्ट ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है। निकटतम आप आ सकते हैं स्ट्रिंग को कार्यान्वित करने के लिए (जिसे कहा जाता है जब उदाहरण को स्ट्रिंग होने के लिए ज़ोर दिया जाना चाहिए) और valueOf (जो इसे एक नंबर पर दबाव डालने के लिए कहा जाता है, उदाहरण के लिए, इसके अलावा, या इसके बाद में कई मामलों में जब इसे संयोजन के लिए उपयोग किया जाता है, क्योंकि + concatenation से पहले करने की कोशिश करता है), जो बहुत सीमित है न ही आपको एक परिणाम के रूप में Vector2 ऑब्जेक्ट बनाने की सुविधा देता है।


इस प्रश्न पर आने वाले लोगों के लिए जो परिणाम के रूप में एक स्ट्रिंग या संख्या चाहते हैं (के बजाय Vector2), though, here are examples of valueOf and toString` के Vector2), though, here are examples of ये उदाहरण ऑपरेटर ओवरलोडिंग को प्रदर्शित नहीं करते हैं , बस जावास्क्रिप्ट के अंतर्निहित हैंडलिंग का लाभ लेने के लिए प्राथमिकताएं परिवर्तित करना:

valueOf

उदाहरण के तौर पर, उदाहरण के तौर पर, आदिम के लिए एक वस्तु की val संपत्ति के मूल्य को दोगुना किया जाता है, उदाहरण के लिए:

 function Thing(val) { this.val = val; } Thing.prototype.valueOf = function() { // Here I'm just doubling it; you'd actually do your longAdd thing return this.val * 2; }; var a = new Thing(1); var b = new Thing(2); console.log(a + b); // 6 (1 * 2 + 2 * 2) 

जैसा कि टीजे ने कहा, आप जावास्क्रिप्ट में ऑपरेटर अधिभार नहीं ले सकते। हालांकि आप मूल्य का लाभ उठा सकते हैं फ़ंक्शन जो हैक लिखने जैसे कार्यों का उपयोग करने से बेहतर लगता है, लेकिन वेक्टर पर बाधाओं को लगाता है जो एक्स और वाई 0 और MAX_VALUE के बीच है यहां कोड है:

 var MAX_VALUE = 1000000; var Vector = function(a, b) { var self = this; //initialize the vector based on parameters if (typeof(b) == "undefined") { //if the b value is not passed in, assume a is the hash of a vector self.y = a % MAX_VALUE; self.x = (a - self.y) / MAX_VALUE; } else { //if b value is passed in, assume the x and the y coordinates are the constructors self.x = a; self.y = b; } //return a hash of the vector this.valueOf = function() { return self.x * MAX_VALUE + self.y; }; }; var V = function(a, b) { return new Vector(a, b); }; 

फिर आप इस तरह समीकरण लिख सकते हैं:

 var a = V(1, 2); //a -> [1, 2] var b = V(2, 4); //b -> [2, 4] var c = V((2 * a + b) / 2); //c -> [2, 4] 

FYI paper.js इस समस्या को पेपरस्क्रिप्ट, एक स्व-निहित, स्कैड जावास्क्रिप्ट बनाकर ऑपरेटर को वैक्टर के ओवरलोडिंग के साथ हल करता है, जो इसे फिर जावास्क्रिप्ट में वापस प्रसंस्करण करता है।

लेकिन कागज़ी पत्र फ़ाइलों को विशेष रूप से निर्दिष्ट और संसाधित करने की आवश्यकता है जैसे कि।

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

 function Vector(x, y) { this.x = x; this.y = y; } const comps = ['x', 'y']; var d = new Vector(0, 0); var v = new Vector(10, 0); var t = 1; for(let c of comps) { d[c] += v[c] * t; } console.log(d); //{ x: 10, y: 0 }