改变Javascript中的数学函数

时间:2014-12-31 01:45:05

标签: javascript

我正在努力改变"数学对象的sin cos和tan函数,因此它可以接受识别它是否是一个度数" d"或弧度。我知道如何做到这一点,但我不知道如果不改变我的主要功能



(function() {
   var angle;
         
   while (angle = parseFloat(readline())) {
      print(Math.sin(angle, "d").toPrecision(5));  // degrees
      print(Math.sin(angle).toPrecision(5));       // radians
      print(Math.cos(angle, "d").toPrecision(5));
      print(Math.cos(angle).toPrecision(5));
      print(Math.tan(angle, "d").toPrecision(5));
      print(Math.tan(angle).toPrecision(5));
   }
})();



  alter如何运作,以便他们可以接受" d"我试过使用Object.create和JSON.parse之类的其他东西(JSON.stringify(Math));但它不起作用我需要知道如何深度复制Math

3 个答案:

答案 0 :(得分:1)

您可以使用继承自Math的对象覆盖Math(在闭包中):

(function(globalMath) {

    // Overriding Math:
    var Math = Object.create(globalMath);

    // Enhancing trigonometric methods:
    var trig = ['sin', 'cos', 'tan'];
    for(var i=0; i<3; ++i)
        Math[trig[i]] = (function(trigFunc){
            return function(angle, d) {
                if(d==="d") angle *= Math.PI / 180;
                return trigFunc(angle);
            };
        })(globalMath[trig[i]]);

    // Now you can use the enhanced methods:
    Math.sin(Math.PI/6); // 0.5
    Math.sin(30, 'd');   // 0.5

    // You can also use original methods:
    globalMath.sin(Math.PI/6);      // 0.5
    globalMath.sin(Math.PI/6, 'd'); // 0.5 ('d' is ignored)

    // Math is a shortcut of globalMath for other methods:
    Math.max(1,2); // 2

})(Math);

答案 1 :(得分:0)

所有内容都是JavaScript中的对象,因此您可以重新编写本机Math函数。但不推荐这样做,正如其他评论员所说的那样。

创建自己的函数可以更简单地在内部转换为度,如下所示:

function sinDegrees(angle) {
    return Math.sin(angle * (Math.PI / 180));
}

如果你想要它甚至可以成为Math对象的一部分:

Math.sinDegrees = sinDegrees;

如果您仍想修改Math.sin这样的功能,那么您可以这样做:

Math._sin = Math.sin; // save a ref. to the old sin
Math.sin = function sin(angle, type) {
    if (type == 'd')
        return Math._sin(angle * (Math.PI / 180));
    else
        return Math._sin(angle);
}

答案 2 :(得分:0)

这里更好的解决方案是拥有一个toRad功能。它看起来与您的目标代码非常相似,但没有违反基本的良好做法(不要修改您没有创建的对象)。

function toRad(angle){
    return angle * (Math.PI / 180);
}

print(Math.sin(toRad(angle)).toPrecision(5));  // degrees
print(Math.sin(angle).toPrecision(5));       // radians
print(Math.cos(toRad(angle)).toPrecision(5));
print(Math.cos(angle).toPrecision(5));
print(Math.tan(toRad(angle)).toPrecision(5));
print(Math.tan(angle).toPrecision(5));

这也使您无法定义每个功能的自定义版本。