我的类中有一个静态数组和一个静态方法,通过这个方法我在数组中推送了一些函数。该方法是在时间轴上调用的,因此当我播放帧两次时,它将推动该函数两次,依此类推。
问题: 如何检查函数是否存在并防止重复?(就像 addeventlistener )
我的类中有一个静态数组和一个静态方法,通过这个方法我在数组中推送了一些函数。该方法是在时间轴上调用的,因此当我播放帧两次时,它将推动该函数两次,依此类推。
问题: 如何检查函数是否存在并防止重复?(就像 addeventlistener )
简短版:不要在时间轴上编码。
长版:如果幸运的话,功能会相同,因此可以使用==
运算符进行比较。但是当您在时间轴上编码时,可能有多个相同功能的实例,所以这不起作用。您可以保存一个静态布尔值,指示您是否已添加它。
但!开始在课堂上编码,从长远来看,它会为你省去很多麻烦,并在 Stack Overflow 上给你更好的答案——这有点像问五星级厨师为什么你只加水和摇晃—— togehter-cake 结果不是很好。
函数是一种动态类型,但编译器通常不允许在函数上创建随机属性,但是,如果你“欺骗”类型检查,你可以在函数上拥有一个属性,以后可以使用它来识别它 - 这种方式函数不必是完全相同的函数。
请注意,这是一件灾难性的事情 :) 但就像琐事知识一样,这可能会在以后有所帮助。
function foo():void { /* some code */ }
function bar():void { /* some code */ }
foo["baz"] = bar["baz"] = 42;
if (foo["baz"] && foo["baz"] == bar["baz"]) trace("equal");
else trace("distinct");
精简版:
var i = arr.indexOf(myFunc);
if(i != -1) arr.push(myFunc);
长版:
我不是时间线专家。我确实知道纯 AS3 中只有一个静态函数的实例,我想当您使用时间轴时它是一样的。
所以你能做的最快的事情就是使用
arrayName.indexOf(funcName);
如果该函数在数组中不存在,它将返回-1,否则它是正确的索引。
如果这不起作用,请告诉我们,我很好奇。
您可以使用 ByteArray 比较对象。对于您的情况,我可能会将函数调用推送到带有函数、参数和“thisObject”的数组中。这是一个粗略的想法。但我可能会创建一个新类,为该等待操作容器扩展 Array。
package {
import flash.display.MovieClip;
import flash.utils.ByteArray;
import flash.events.MouseEvent;
public class Main extends MovieClip {
private static var awaiting:Array = [];
private function pushAction(func:Function,args:Array=null,thisArg:*=null):uint {
var newObj:Object = {
func :func,
args :args,
thisArg :thisArg
}
for (var i:int = 0; i < Main.awaiting.length; i++) {
if (duplicates(Main.awaiting[i],newObj)) return i;
}
return Main.awaiting.push(newObj);
}
private function nextAction(extraArgs:Array=null):* {
if (Main.awaiting.length == 0) return null;
var o:Object = Main.awaiting.shift();
var args:Array = o.args;
if (extraArgs) args = args == null ? extraArgs : args.concat(extraArgs);
var thisArg:* = o.thisArg;
var func:Function = o.func;
return func.apply(thisArg,args);
}
private static function duplicates(item1:Object,item2:Object):Boolean {
var bArr1:ByteArray = new ByteArray();
var bArr2:ByteArray = new ByteArray();
bArr1.writeObject(item1);
bArr2.writeObject(item2);
bArr1.position = 0;
bArr2.position = 0;
var str1:String = bArr1.readUTFBytes(bArr1.length);
var str2:String = bArr2.readUTFBytes(bArr2.length);
return str1 == str2;
}
public function Main() {
pushAction(function(){trace('the first item')});
pushAction(traceMe,['the second item']);
pushAction(traceMe,['the third item']);
pushAction(sayHi,null,Main);
pushAction(function(){trace('the first item')});
pushAction(traceMe,['the second item']);
pushAction(traceMe,['the third item']);
pushAction(sayHi,null,Main);
stage.addEventListener(MouseEvent.CLICK,clicked);
}
private function clicked(e:MouseEvent):void {
this.nextAction();
}
public function traceMe(str:String):void {
trace(str);
}
private static function sayHi():void {
trace('hi');
}
}
}