दिलचस्प पोस्ट
वर्तमान कर्सर स्थिति प्राप्त करें सी # WebRequest वेबब्रोज कुकी का उपयोग करना एक बाउंडिंग बॉक्स फिट करने के लिए चित्र स्केल करें सी # में बंद करने के लिए पुस्तकालय / एपीआई की सलाह देते हैं जावा सॉकेट IOException – अनुमति अस्वीकृत Groovy शेल कमानों को क्रियान्वित करता है ORA-12514 टीएनएस: वर्तमान में कनेक्ट डिस्क्रिप्टर में अनुरोधित सेवा का श्रोता नहीं जानते मैटैब में .exe फ़ाइल को शुरू करने के बाद प्रोग्राम को एक कुंजी दर्ज करें किसी VSTO ऐडिन का निवारण कैसे करें जो लोड नहीं होता है? एचटीएमएल 5 में इसका क्या मतलब है जब कोई विशेषता बुलियन विशेषता है? PHP से कॉल करें और वापसी कोड प्राप्त करें Android में लेआउट में ओरिएंटेशन परिवर्तन का पता कैसे लगा सकता है? Google Compute Engine में विशिष्ट पोर्ट 9 9090 में कैसे खोलें एपीआई पर अंक लगाना सर्वश्रेष्ठ प्रथाओं सी # समर्थन वापसी प्रकार सह प्रकार है?

जावास्क्रिप्ट में ओवरलोडिंग अंकगणित ऑपरेटर्स?

यह जावास्क्रिप्ट "वर्ग" परिभाषा के अनुसार, यह सबसे अच्छा तरीका है कि मैं इस सवाल को phrasing के बारे में सोच सकता हूँ:

var Quota = function(hours, minutes, seconds){ if (arguments.length === 3) { this.hours = hours; this.minutes = minutes; this.seconds = seconds; this.totalMilliseconds = Math.floor((hours * 3600000)) + Math.floor((minutes * 60000)) + Math.floor((seconds * 1000)); } else if (arguments.length === 1) { this.totalMilliseconds = hours; this.hours = Math.floor(this.totalMilliseconds / 3600000); this.minutes = Math.floor((this.totalMilliseconds % 3600000) / 60000); this.seconds = Math.floor(((this.totalMilliseconds % 3600000) % 60000) / 1000); } this.padL = function(val){ return (val.toString().length === 1) ? "0" + val : val; }; this.toString = function(){ return this.padL(this.hours) + ":" + this.padL(this.minutes) + ":" + this.padL(this.seconds); }; this.valueOf = function(){ return this.totalMilliseconds; }; }; 

और निम्न परीक्षण सेटअप कोड:

 var q1 = new Quota(23, 58, 50); var q2 = new Quota(0, 1, 0); var q3 = new Quota(0, 0, 10); console.log("Quota 01 is " + q1.toString()); // Prints "Quota 01 is 23:58:50" console.log("Quota 02 is " + q2.toString()); // Prints "Quota 02 is 00:01:00" console.log("Quota 03 is " + q3.toString()); // Prints "Quota 03 is 00:00:10" 

क्या किसी भी प्रकार के अतिरिक्त ऑपरेटर के रूप में q4 ऑब्जेक्ट के रूप में q4 निर्माण करने का कोई तरीका है …

 var q4 = q1 + q2 + q3; console.log("Quota 04 is " + q4.toString()); // Prints "Quota 04 is 86400000" 

बजाय का सहारा …

 var q4 = new Quota(q1 + q2 + q3); console.log("Quota 04 is " + q4.toString()); // Prints "Quota 04 is 24:00:00" 

यदि नहीं, तो गणित ऑपरेटरों के जरिए कस्टम संख्यात्मक जावास्क्रिप्ट ऑब्जेक्ट को कंपोज़ बनाने के लिए इस क्षेत्र में सर्वश्रेष्ठ अभ्यास की सिफारिशें क्या हैं?

Solutions Collecting From Web of "जावास्क्रिप्ट में ओवरलोडिंग अंकगणित ऑपरेटर्स?"

जहाँ तक मुझे पता है, जावास्क्रिप्ट (कम से कम जैसा कि अब मौजूद है) ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है।

सबसे अच्छा मैं सुझा सकता हूं कि कई अन्य लोगों से नई कोटा ऑब्जेक्ट बनाने के लिए एक क्लास विधि है। मेरा क्या मतलब है इसका एक त्वरित उदाहरण है:

 // define an example "class" var NumClass = function(value){ this.value = value; } NumClass.prototype.toInteger = function(){ return this.value; } // Add a static method that creates a new object from several others NumClass.createFromObjects = function(){ var newValue = 0; for (var i=0; i<arguments.length; i++){ newValue += arguments[i].toInteger(); } return new this(newValue) } 

और इसे इस तरह प्रयोग करें:

 var n1 = new NumClass(1); var n2 = new NumClass(2); var n3 = new NumClass(3); var combined = NumClass.createFromObjects(n1, n2, n3); 

दुर्भाग्यवश नहीं।

फ़ॉलबैक के लिए, यदि आप रिटर्न मान की व्यवस्था करते हैं, तो आप विधि शृंखला का उपयोग कर सकते हैं

 var q4 = q1.plus(p2).plus(q3); 

चूंकि हर किसी ने मेरे दूसरे उत्तर को वोट दिया था, मैं अवधारणा कोड का सबूत पोस्ट करना चाहता था जो वास्तव में काम करता है।

यह क्रोम और IE में परीक्षण किया गया है।

 //Operator Overloading var myClass = function () { //Privates var intValue = Number(0), stringValue = String(''); //Publics this.valueOf = function () { if (this instanceof myClass) return intValue; return stringValue; } this.cast = function (type, call) { if (!type) return; if (!call) return type.bind(this); return call.bind(new type(this)).call(this); } } //Derived class var anotherClass = function () { //Store the base reference this.constructor = myClass.apply(this); var myString = 'Test', myInt = 1; this.valueOf = function () { if (this instanceof myClass) return myInt; return myString; } } //Tests var test = new myClass(), anotherTest = new anotherClass(), composed = test + anotherTest, yaComposed = test.cast(Number, function () { return this + anotherTest }), yaCComposed = anotherTest.cast(Number, function () { return this + test; }), t = test.cast(anotherClass, function () { return this + anotherTest }), tt = anotherTest.cast(myClass, function () { return this + test; }); debugger; 

अगर कोई तकनीकी रूप से इतना स्पष्ट होगा कि यह क्यों अच्छा नहीं है, तो मुझे यह सुनकर खुशी होगी!

दूसरा सुझाव:

 var q4 = Quota.add(q1, q2, q3); 

मैं हाल ही में इस लेख पर आया था: http://www.2ality.com/2011/12/fake-operator-overloading.html

यह बताता है कि कैसे आप मूल्य को फिर से परिभाषित कर सकते हैं। ऐसा लगता है कि आप वास्तव में ऑब्जेक्ट्स पर म्यूटेटर ऑपरेशन कर सकते हैं, इसलिए यह ऐसा नहीं करेगा जो आप चाहते हैं। इसकी दिलचस्प हालांकि फिर भी

आप पूर्णांक या स्ट्रिंग को परिवर्तित कर सकते हैं, आपकी ऑब्जेक्ट्स

यदि जावास्क्रिप्ट को कोई संख्या या स्ट्रिंग की अपेक्षा होती है तो ऑब्जेक्ट केवल रूप से परिवर्तित होते हैं। पूर्व के मामले में, रूपांतरण तीन चरण लेता है:

1.- कॉल मूल्यऑफ () यदि परिणाम आदिम है (कोई ऑब्जेक्ट नहीं है) तो इसका उपयोग करें और उसे किसी संख्या में कनवर्ट करें।

2.- अन्यथा, कॉल करने के लिए स्ट्रिंग () यदि परिणाम आदिम है, तो उसका उपयोग करें और इसे किसी संख्या में कनवर्ट करें।

3.- अन्यथा, एक TypeError फेंक दें। चरण 1 के लिए उदाहरण:

3 * {valueOf: फ़ंक्शन () {रिटर्न 5}}

यदि जावास्क्रिप्ट स्ट्रिंग में परिवर्तित होता है, तो चरण 1 और 2 को स्वैप किया जाता है: toString () पहले की कोशिश की जाती है, valueOf () दूसरा।

http://www.2ality.com/2013/04/quirk-implicit-conversion.html

मुझे यकीन नहीं है कि लोग इस सवाल का उत्तर नहीं देते हैं।

बिल्कुल एक रास्ता है जो मैं एक बहुत ही छोटी सी स्क्रिप्ट के साथ रूपरेखा करता हूं जो आपको समझने के लिए जॉन रेसिग नहीं होना चाहिए …

इससे पहले कि मैं ऐसा करता हूं, मैं यह भी बताता हूं कि जावास्क्रिप्ट में जिस तरह से आपके कन्स्ट्रक्टर ने काम किया होता है, वह सरणी के लिए जाँच कर या 'आर्ग्यूमेंट्स' को शाब्दिक रूप से चलाना है।

उदाहरण के लिए मेरे 'वर्ग' के मेरे कंस्ट्रक्टर में मैं औजारों को पुनरावृत्त करता हूं, अंतर्निहित आक्षेपों के प्रकार को निर्धारित करता हूं और इसे बौद्धिक रूप से संसाधित करता हूं

इसका मतलब यह है कि यदि आप एक सरणी पारित करते हैं तो मैं सरणी को खोजने के लिए arugments को पुनरावृत्त करता हूँ और फिर सरणी में तत्व के प्रकार के आधार पर आगे की प्रक्रिया करने के लिए सरणी को फिर से दोहराता हूं।

उदाहरण -> नए कुछ क्लास ([उदाहरण ए, उदाहरणबी, उदाहरण सी])

हालांकि आप लोग ऑपरेटर ओवरलोडिंग के लिए एक और "सी" शैली दृष्टिकोण की मांग कर रहे हैं जो वास्तव में पॉपुलेल विश्वास के विपरीत प्राप्त किया जा सकता है।

यहाँ एक ऐसा वर्ग है जिसे मैंने Mootools का उपयोग करके बनाया है जो ऑपरेटर ओवरलोडिंग का सम्मान करता है। सादे पुरानी जावास्क्रिप्ट में आप केवल स्ट्रिंग विधि को उसी का उपयोग करेंगे, केवल इसे सीधे उदाहरण के प्रोटोटाइप के साथ संलग्न करें

इस दृष्टिकोण को प्रदर्शित करने का मेरा मुख्य कारण यह है कि मैं लगातार पढ़ता हुआ पाठ के कारण कहता हूं कि यह कार्यक्षमता अनुकरण करने के लिए "असंभव" है। कुछ भी असंभव नहीं है जो केवल पर्याप्त मुश्किल है और मैं इसे नीचे प्रदर्शित करेगा …

  ////// debugger; //Make a counter to prove I am overloading operators var counter = 0; //A test class with a overriden operator var TestClass = new Class({ Implements: [Options, Events], stringValue: 'test', intValue: 0, initialize: function (options) { if (options && options instanceof TestClass) { //Copy or compose this.intValue += options.intValue; this.stringValue += options.stringValue; } else { this.intValue = counter++; } }, toString: function () { debugger; //Make a reference to myself var self = this; //Determine the logic which will handle overloads for like instances if (self instanceof TestClass) return self.intValue; //If this is not a like instance or we do not want to overload return the string value or a default. return self.stringValue; } }); //Export the class window.TestClass = TestClass; //make an instance var myTest = new TestClass(); //make another instance var other = new TestClass(); //Make a value which is composed of the two utilizing the operator overload var composed = myTest + other; //Make a value which is composed of a string and a single value var stringTest = '' + myTest; ////// 

इस नामकरण का सबसे हालिया प्रदर्शन XDate के दस्तावेज़ीकरण पृष्ठ पर देखा गया: http://arshaw.com/xdate/

इस मामले में मेरा मानना ​​है कि यह वास्तव में भी आसान था, वह उसी वस्तु को प्राप्त करने के लिए तिथि वस्तु के प्रोटोटाइप का इस्तेमाल कर सकता था।

कोई भी ऐसा तरीका नहीं जिसकी मैंने एक उदाहरण के रूप में दिया है, जिसे दूसरों के लिए उपयोग की इस शैली को चित्रित करना चाहिए।

संपादित करें:

मेरे यहां एक पूर्ण कार्यान्वयन है:

http://netjs.codeplex.com/

अन्य सामान के साथ

मैंने एक स्क्रिप्ट बनाई जो ऑपरेटर को ओवरराइड करते हुए जावास्क्रिप्ट करता है यह काम करने के लिए सीधे आगे नहीं था, इसलिए कुछ शंकराचार्य हालांकि हैं। मैं प्रोजेक्ट पेज से यहाँ चेतावनियों को पार कर दूंगा, अन्यथा आप नीचे दिए गए लिंक को पा सकते हैं:

  • गणना परिणामों को एक नए ऑब्जेक्ट में पारित किया जाना चाहिए, इसलिए (p1 + p2 + p3) के बजाय आपको नया बिंदु (p1 + p2 + p3) करना होगा, (आपके उपयोगकर्ता परिभाषित वस्तु को "बिंदु" नाम दिया गया है)।

  • केवल +, -, * और / समर्थित हैं, पांचवें अंकगणितीय opperator% नहीं है। स्ट्रिंग ("+ + 1") और तुलना (पी 1 == पी 2) के लिए ज़बरदस्त कार्यवाही अपेक्षा के अनुरूप काम नहीं करेगा यदि आवश्यक हो तो इन कार्यों के लिए नए फ़ंक्शंस बनाए जाएं, जैसे (p1.val == p2.val)।

  • आखिरकार, कम्प्यूटेशनल संसाधनों की गणना की गणना करने के लिए ज़रूरी है कि शब्दों की संख्या के साथ क्वाडट्रैक्ट बढ़ जाती है इसलिए केवल 6 शब्द प्रति डिफ़ॉल्ट में एक गणना श्रृंखला में अनुमत है (हालांकि यह बढ़ाया जा सकता है)। नई बिंदु (पी 1 + पी 2 + पी 3 + पी 4 + पी 5 + पी 6) + नया बिंदु (पी 7 + पी 8 + पी 9 + पी 10 + पी 11 + पी 12)) की तुलना में अब तक की गणना श्रृंखलाओं के लिए, गणनाओं को विभाजित करें जैसे:

जिथूब पृष्ठ ।

पहले से ही कहा गया है कि इसके अलावा: ओवरराइडिंग .valueOf () काफी शक्तिशाली ऑपरेटर ओवरलोडिंग उत्पादन करने में मदद कर सकता है। प्रूफ-ऑफ-अवधारणा में फिंगर्स.जेएस लिब आप ईवेंट श्रोताओं को। नेट शैली में जोड़ सकते हैं:

 function hi() { console.log("hi") } function stackoverflow() { console.log("stackoverflow") } function bye() { console.log("bye") } on(yourButton).click += hi + stackoverflow; on(yourButton).click -= hi - bye; 

मूल विचार को अस्थायी रूप से बदलना है जब पर () कहा जाता है:

 const extendedValueOf = function () { if (handlers.length >= 16) { throw new Error("Max 16 functions can be added/removed at once using on(..) syntax"); } handlers.push(this); // save current function return 1 << ((handlers.length - 1) * 2); // serialize it as a number. }; 

तो फिर संख्या वापस तोहफेदार सरणी का उपयोग करके फ़ंक्शन में डी-क्रमबद्ध हो सकती है। क्या अधिक है अंतिम मूल्य (func1 + func2 – func3) से बिट निकालने संभव है, आप प्रभावी ढंग से समझ सकते हैं कि कहां कार्य किया गया है, और किन कार्यों को हटा दिया गया था।

आप जिथूब पर स्रोत को देख सकते हैं और डेमो के साथ यहां खेल सकते हैं ।

इस अनुच्छेद में पूर्ण विवरण मौजूद है (यह एएस 3 के लिए है, क्योंकि यह यूके के लिए काम करेगा)

कुछ सीमित उपयोग मामलों के लिए आप ऑपरेटर "ओवरलोडिंग" प्रभाव डाल सकते हैं:

 function MyIntyClass() { this.valueOf = function() { return Math.random(); } } var a = new MyIntyClass(); var b = new MyIntyClass(); a < b false a + b 0.6169137847609818 [a, b].sort() // O(n^2) ? [myClass, myClass] function MyStringyClass() { this.valueOf = function() { return 'abcdefg'[Math.floor(Math.random()*7)]; } } c = new MyStringyClass(); 'Hello, ' + c + '!' Hello, f! 

उपरोक्त कोड एमआईटी लाइसेंस के तहत उपयोग करने के लिए स्वतंत्र है। YMMV।

Paper.js ऐसा करता है, उदाहरण के लिए बिंदु के साथ ( डॉक्स ):

 var point = new Point(5, 10); var result = point + 20; console.log(result); // {x: 25, y: 30} 

लेकिन यह इसका अपना कस्टम स्क्रिप्ट पार्सर का उपयोग करता है