我正在开发依赖于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"
。
为什么这不起作用,更重要的是,我怎样才能让它再次发挥作用?
答案 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
此时,您也可以创建自己的类,而不是修改现有的类。
幸运的是,对于我的情况,这意味着没有这些扩展的任何用法(至少不是静态类型的用法),所以我应该能够安全地删除扩展而不用担心它:)