为什么我不能扩展静态Math类?

时间:2017-11-06 16:52:49

标签: actionscript-2

我正在开发依赖于Math类的一些扩展的ActionScript 2项目,通常是这样做的:

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

允许调用者只写(例如)

Math.sinD(60);

但是,当我尝试使用原始行进行编译时,出现以下错误: There is no property with the name "sinD"

为什么这不起作用,更重要的是,我怎样才能让它再次发挥作用?

2 个答案:

答案 0 :(得分:1)

在我心目中看起来不可能。 在单独的类中创建静态sinD方法。

答案 1 :(得分:1)

“问题”在于ActionScript 2的静态类型检查。您无法直接修改类,因为它会检查您尝试访问的属性是否存在。但是,如果绕过类型检查,则可以执行此操作:

if textfieldpassword.text == "" || textfieldusername.text == ""
{
    btnlogin.isEnabled = false
}
else
{
    btnlogin.isEnabled = true
}

或者......(这些都做同样的事情)

var Math2 = Math; // thing now holds a reference to the same Math class, but with no type set
// Add a new method
Math2.sinD = function(angle) {
    return Math.sin(angle*(Math.PI/180));
};
// Now the Math has 'sinD' as a method

但是,这并没有什么帮助,因为静态类型检查也在调用位置强制执行,因此您可以访问任何动态添加的方法。

Math['sinD'] = function(angle) {
    return Math.sin(angle*(Math.PI/180));
};

相反,你需要这样做:

Math.sinD(30) // This will not compile

此时,您也可以创建自己的类,而不是修改现有的类。

幸运的是,对于我的情况,这意味着没有这些扩展的任何用法(至少不是静态类型的用法),所以我应该能够安全地删除扩展而不用担心它:)