我正在努力改变"数学对象的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));
}
})();

答案 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));
这也使您无法定义每个功能的自定义版本。