2013-07-26 18 views
6

我需要JavaScript的Math對象中的方法來計算任何基數的對數。所以基本上我做的是這樣的:如何在JavaScript中添加數學方法

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

這樣擴展內置函數的缺點是什麼?

爲了讓我的情況更加清晰,我正在接受用戶輸入,並將其替換爲適當的Math對象函數名稱並將其傳遞給eval進行計算。如果這還不清楚,我的困境是,就我而言,我必須使用eval(即使它是邪惡的),並擴展Math對象函數最適合我的情況。

當我像這樣擴展內置函數或是完全正常的事情時,是否可能存在一些奇怪的錯誤或其他問題?

+0

沒有Math()構造函數,所以你不能原型它數學函數只是函數,而不是對象的方法。 – defaultNINJA

+0

是的,它不能原型。 –

+0

@Jack_of_All_Trades是的,它可以被原型。看到我的答案。 – Neal

回答

6

你不應該修改你不擁有的東西。

  • 如果使用其他插件或第三方代碼添加他們自己的版本的log_bMath,它提供了一個完全不同的簽名,會發生什麼?

  • 如果未來的JavaScript版本定義了log_b的0123?版本,會發生什麼情況?

有人要哭了,因爲有人它不會做,他們期望它是什麼。


我不知道爲什麼延長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

我不知道這是如何回答這個問題?他已經將自己的方法添加到'Math'(它運行http://jsfiddle.net/QnUsf/),他問是否可以,不是? – Matt

+0

@Matt更新。 OP的FN和我的FN不是真的一樣... – Neal

+1

你是對的;你的IE不能工作,IE不支持非標準的'__proto__',因爲他的意志是:P。 – Matt

相關問題