AS3几个容易出错的地方
2010-03-25 22:50
232 查看
在写AS3代码的过程中,有些编译错误,或者运行错误,是很难检查。这儿我总结了一些曾经碰到过
的问题。
1、TypeError: Error #1006: value 不是函数。
这是在运行时的报错,我们来看
看是一段什么样的代码导致他报错的
大家先找找这段代码错在哪,为什么导致这个错误,然后在看看后面说的错误原因
private function clickHandle(e:MouseEvent):void{
if(e.currentTarget
is Sprite){
e.updateAfterEvent()
(e.currentTarget as
Sprite).visible = false;
}
}
如果你是传统程序员,这个错误一般情况来说,你都不会犯的;如果
你是AS2到AS3的,或者说你以前写asp等网页程序的,这个问题的引发几率就相对比较高了。
我们都知道AS3的代码,如果没有";"的情况下
也是可以编译、可以运行的。不过恰恰上述代码在e.updateAfterEvent()后因为没有";",导致他运行错误。因为这段代码在运行时,它是
被当成了这样在运行
e.updateAfterEvent()(e.currentTarget as
Sprite).visible = false;
updateAfterEvent返回的是void类型,那么把他当成函数来调用,自然会
报错 value 不是函数。
总结1:大家明白了吗?从上面这个例子可以看出,养
成加";"号的习惯还是非常重要的。
2、TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::Event 转换为
MyEvent。
同样这也是一个运行错误,我们来看看是一段什么样的代码导致他报错的
大家也先找找他的错在哪
首先先看一下这个MyEvent类
package
{
import flash.events.Event;
public class MyEvent extends Event
{
public static
const MY:String = "my";
public function
MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type,
bubbles, cancelable);
}
}
}
然后侦听这个事件,在得
到它后转发到spr对象中
addEventListener(MyEvent.MY,myHandle);
private
function myHandle(e:MyEvent):void{
spr.dispatchEvent(e);
}
再
就是,spr对象中侦听了这个事件
spr.addEventListener(MyEvent.MY,myHandle);
private
function myHandle(e:MyEvent):void{
trace(e);
}
最后在这个侦听的地方就报
错了。
在殿堂之路中,继承Event自定义事件举例中讲过这种问题的解决办法,但没有讲的很详细
很多新手在看高手的代码,都会看到自定义事件中都
会重构clone这个方法,但是自己尝试后发现,不重构clone也不会出现什么问题,以至于有些人在写项目赶时间时,也不太喜欢100%模仿高手的写
法,就会把重构clone这个看似很小,其实隐藏了秘密的东西给忽略掉。
在殿堂之路中有句原话:
以下摘抄《殿堂之路》第300页原话
其中clone()方法最为重要,使用clone()方法可以返回当前事件对象的一个拷贝。这个
clone()方法一般不需要我们手工调用,当我们将一个事件对象重复发送时,EventDispatcher类会自动调用clone()方法,产生这个
事件的拷贝。
而上面的代码中就是在将MyEvent事件重复发送,好理解的说就是转发MyEvent事件,如果没有重构
MyEvent事件,那么EventDispatcher在重复发送时,调用的clone是Event的clone方法,那么clone出来的事件自然就
是Event类,而不是MyEvent,所以你在侦听时使用e:MyEvent类型接收时,自然就会报错无法将Event类转换成MyEvent类。
总结2:看书要仔细,看高手的代码一定要学习透彻,而不是拿来主义,或者是模仿主义!
的问题。
1、TypeError: Error #1006: value 不是函数。
这是在运行时的报错,我们来看
看是一段什么样的代码导致他报错的
大家先找找这段代码错在哪,为什么导致这个错误,然后在看看后面说的错误原因
private function clickHandle(e:MouseEvent):void{
if(e.currentTarget
is Sprite){
e.updateAfterEvent()
(e.currentTarget as
Sprite).visible = false;
}
}
如果你是传统程序员,这个错误一般情况来说,你都不会犯的;如果
你是AS2到AS3的,或者说你以前写asp等网页程序的,这个问题的引发几率就相对比较高了。
我们都知道AS3的代码,如果没有";"的情况下
也是可以编译、可以运行的。不过恰恰上述代码在e.updateAfterEvent()后因为没有";",导致他运行错误。因为这段代码在运行时,它是
被当成了这样在运行
e.updateAfterEvent()(e.currentTarget as
Sprite).visible = false;
updateAfterEvent返回的是void类型,那么把他当成函数来调用,自然会
报错 value 不是函数。
总结1:大家明白了吗?从上面这个例子可以看出,养
成加";"号的习惯还是非常重要的。
2、TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::Event 转换为
MyEvent。
同样这也是一个运行错误,我们来看看是一段什么样的代码导致他报错的
大家也先找找他的错在哪
首先先看一下这个MyEvent类
package
{
import flash.events.Event;
public class MyEvent extends Event
{
public static
const MY:String = "my";
public function
MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type,
bubbles, cancelable);
}
}
}
然后侦听这个事件,在得
到它后转发到spr对象中
addEventListener(MyEvent.MY,myHandle);
private
function myHandle(e:MyEvent):void{
spr.dispatchEvent(e);
}
再
就是,spr对象中侦听了这个事件
spr.addEventListener(MyEvent.MY,myHandle);
private
function myHandle(e:MyEvent):void{
trace(e);
}
最后在这个侦听的地方就报
错了。
在殿堂之路中,继承Event自定义事件举例中讲过这种问题的解决办法,但没有讲的很详细
很多新手在看高手的代码,都会看到自定义事件中都
会重构clone这个方法,但是自己尝试后发现,不重构clone也不会出现什么问题,以至于有些人在写项目赶时间时,也不太喜欢100%模仿高手的写
法,就会把重构clone这个看似很小,其实隐藏了秘密的东西给忽略掉。
在殿堂之路中有句原话:
以下摘抄《殿堂之路》第300页原话
其中clone()方法最为重要,使用clone()方法可以返回当前事件对象的一个拷贝。这个
clone()方法一般不需要我们手工调用,当我们将一个事件对象重复发送时,EventDispatcher类会自动调用clone()方法,产生这个
事件的拷贝。
而上面的代码中就是在将MyEvent事件重复发送,好理解的说就是转发MyEvent事件,如果没有重构
MyEvent事件,那么EventDispatcher在重复发送时,调用的clone是Event的clone方法,那么clone出来的事件自然就
是Event类,而不是MyEvent,所以你在侦听时使用e:MyEvent类型接收时,自然就会报错无法将Event类转换成MyEvent类。
总结2:看书要仔细,看高手的代码一定要学习透彻,而不是拿来主义,或者是模仿主义!
相关文章推荐
- 使用指针时,容易出错的几个地方
- 编写JavaScript时容易出错的几个地方
- C、C++语言容易出错的几个地方
- C、C++语言容易出错的几个地方
- C、C++容易出错的几个地方
- c语言几个松散的地方(不足的地方,不严谨的地方,它容易出错的地方)。
- C语言中容易出错的几个地方
- 强联通分量容易出错的地方
- sql2005 odbc建立连接容易出错的地方
- Java向前引用容易出错的地方
- zabbix 安装容易出错的地方
- php容易出错的地方
- sulley里面Pcapy模块安装容易出错地方
- JAVA日常工作容易出错的地方小汇总
- 两组数组之间复制容易出错地方
- UINavigationController容易出错的地方
- JS比较容易迷惑的几个地方
- KDevelop开发经验,一个容易出错的地方。
- 初学java线程同步容易出错的地方(我的第一篇博客)
- 数组循环时新手容易出错的地方