2013-07-26 5 views
6

में मैथ के लिए विधि कैसे जोड़ सकता हूं मुझे जावास्क्रिप्ट के गणित ऑब्जेक्ट में एक विधि की आवश्यकता है जो किसी भी आधार के लॉगरिदम की गणना करता है। तो मूल रूप से यह है कि क्या मैंने किया था:मैं जावास्क्रिप्ट

Math.log_b=function(b,x){return Math.log(x)/Math.log(b);} 

का विस्तार इस तरह निर्मित समारोह का नकारात्मक पहलू क्या है?

मेरी स्थिति को और स्पष्ट करने के लिए, मैं उपयोगकर्ता इनपुट ले रहा हूं और उचित गणित ऑब्जेक्ट फ़ंक्शन नामों के साथ इसे बदल रहा हूं और इसे गणना के लिए निकालने के लिए पास कर रहा हूं। यदि यह स्पष्ट नहीं है, तो मेरे दुविधा में, मेरे मामले में, मुझे eval (भले ही यह बुरा है) का उपयोग करना है और मैथ ऑब्जेक्ट फ़ंक्शन को विस्तारित करना मेरे मामले के लिए उपयुक्त है।

क्या कुछ अजीब बग या अन्य की संभावना है जब मैं इस तरह के अंतर्निहित फ़ंक्शन का विस्तार करता हूं या यह पूरी तरह से सामान्य चीजें करता है?

+0

कोई गणित() कन्स्ट्रक्टर नहीं है, इसलिए आप इसे प्रोटोटाइप नहीं कर सकते हैं गणित कार्य केवल कार्य हैं, किसी ऑब्जेक्ट के तरीकों से नहीं। – defaultNINJA

+0

हां, इसे प्रोटोटाइप नहीं किया जा सकता है। –

+0

@Jack_of_All_Trades हां इसे प्रोटोटाइप किया जा सकता है। मेरा जवाब देखें पॉइंटर्स – Neal

उत्तर

6

आपको वह नहीं संशोधित करना चाहिए जो आपके पास नहीं है।

  • एक और प्लगइन या 3 पार्टी कोड का उपयोग अपने स्वयं के जो एक पूरी तरह से अलग हस्ताक्षर प्रदान करता है Math करने के लिए log_b के संस्करण कहते हैं, तो क्या होगा?

  • क्या होता है यदि जावास्क्रिप्ट का भविष्य संस्करण पर log_b का अपना संस्करण परिभाषित करता है?

किसी क्योंकि किसी लिए रोना जा रहा है, यह अभ्यस्त क्या वे इसे करने की उम्मीद करते हैं।


मैं क्यों Mathसबसे अच्छा सूट अपने मामले विस्तार यकीन नहीं है।

function my_log_b(b,x){return Math.log(x)/Math.log(b);} 

... अभी भी आपके मामले के अनुरूप लगता है। इससे भी बेहतर, अपना नामस्थान परिभाषित करें, और इसे वहां रखें;

var ME = {}; 

ME.log_b = function (b,x){return Math.log(x)/Math.log(b);} 
+0

+1 स्पष्ट उत्तर मैट के लिए धन्यवाद। वास्तव में मेरे लिए सहायक! – exexzian

+0

के लिए –

0

आप इसे प्रोटोटाइप कर सकते हैं:

if (Math.__proto__) { 
    Math.__proto__.log_b=function(b,x){ return this.log(x)/this.log(b); } 
} 
else { 
    alert('Cannot prototype `Math`'); 
} 

लेकिन यह शायद सबसे अच्छा विचार है कि आप अधिलेखित किया जा सकता है ब्राउज़र कोड में नहीं है।

इस विधि को आपके द्वारा बनाए गए ऑब्जेक्ट में जोड़ने के लिए बेहतर है।

+0

मुझे यकीन नहीं है कि यह प्रश्न का उत्तर कैसे देता है? उन्होंने पहले से ही 'मथ' (जो http://jsfiddle.net/QnUsf/) पर काम किया है, वह पूछ रहा है, वह पूछ रहा है कि यह ठीक है, नहीं? – Matt

+0

@ मैट अपडेट किया गया। ओपीएस एफएन और मेरे एफएन वास्तव में वही नहीं हैं ... – Neal

+1

आप सही हैं; आपका आईई में काम नहीं करेगा, जो गैर-मानक '__proto__' का समर्थन नहीं करता है, जहां उसकी इच्छा के रूप में: पी। – Matt

संबंधित मुद्दे