Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 为什么不';当对象重新转换为原始类型时是否重置属性?_Actionscript 3 - Fatal编程技术网

Actionscript 3 为什么不';当对象重新转换为原始类型时是否重置属性?

Actionscript 3 为什么不';当对象重新转换为原始类型时是否重置属性?,actionscript-3,Actionscript 3,我试图在这里问这个问题,但没有得到满意的答案。() 再问一次。 在类上执行强制转换时,为什么不释放成员函数?在下面的例子中,我预计在向Sprite施放之后,类应该会丢失所有关于当前帧的信息。但它保留了这些信息,好像铸造只是一个“炫耀”,而不是“实际完成”内部 import flash.display.MovieClip; import flash.display.Sprite; var mc:MovieClip mc.gotoAndStop(2); trace(mc.currentFram

我试图在这里问这个问题,但没有得到满意的答案。() 再问一次。 在类上执行强制转换时,为什么不释放成员函数?在下面的例子中,我预计在向Sprite施放之后,类应该会丢失所有关于当前帧的信息。但它保留了这些信息,好像铸造只是一个“炫耀”,而不是“实际完成”内部

import flash.display.MovieClip;
import flash.display.Sprite;

var mc:MovieClip 
mc.gotoAndStop(2);
trace(mc.currentFrame);  // output 2  --> that's ok 

var sprite:Sprite = Sprite(mc)

trace( MovieClip(sprite).currentFrame);//output 2, value not lost, which is questionable
输出: 2. 二,

我知道,答案可能是,Adobe是如何做到的。但逻辑是什么?理想的逻辑应该是,在施法和重铸之后,所有值都必须恢复为默认值。(“0”在本例中)


V.

我不确定您在这里想做什么,但像MovieClip(精灵)。currentFrame这样的东西显然会导致奇怪的结果。因为你要把你的精灵演成电影唇,所以它会有一个当前帧。尝试在精灵上执行currentFrame,看看会发生什么。

强制转换不会清除成员字段。显示其他人可以访问的内容 从该对象,但不更改该对象

在flash中,对象通过引用传递。想象你在内存中有一个对象(在你的例子中是mc)。当您通过强制转换mc来创建sprite时,您将引用(内存地址)传递给sprite变量。此时,mc和sprite指向内存中的相同地址。当你们把精灵投给MovieClip时,你们会从mc传来相同的地址。这个地址是MovieClip mc的地址,此时currentFrame将访问mc的值。强制转换不像复制构造函数

编辑。 通过使用这一点,我创建了简单的代码来证明我的话:

var memoryHash:String;

var mc: MovieClip = new MovieClip();
var s: Sprite = Sprite( mc );
try
{
      FakeClass(mc);
}
catch (e:Error)
{
    memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}

trace( memoryHash );
try
{
    FakeClass(s);
}
catch (e:Error)
{
        memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}

trace( memoryHash );
还有假课堂:

包装{ 公开课假课{ 公共函数FakeClass(){} } }

输出将显示mc和s的内存地址。正如你所看到的,他们是平等的。在我的mashine中,输出是

@35ed041 @35ed041


它没有给出威德的结果。(我刚刚用输出更新了我的问题)我在两个轨迹中都闪现了轨迹“0”,但对于空剪辑来说,这可能不太正常。请添加var mc:MovieClip=new MovieClip();哦我已经在舞台上加了一部电影。当然,电影剪辑不应该是空的。它应该至少有两帧。Thnxpublic成员-字段和方法。一般来说,当你施法时,你不会改变对象。在flash中,对象通过引用传递。想象你在内存中有一个对象(在你的例子中是mc)。当您通过强制转换mc来创建sprite时,您将引用(内存地址)传递给sprite变量。此时,mc和sprite指向内存中的相同地址。当你们把精灵投给MovieClip时,你们会从mc传来相同的地址。这个地址是MovieClip mc的地址,此时currentFrame将访问mc的值。选角不像复制构造器,Azzy Elvul说的话是对的。另一个示例将向您展示强制转换在任何方面都不会改变原始对象:
import flash.display.*;var mc:MovieClip=新的MovieClip();var c:Sprite=Sprite(mc)trace(mc.currentFrame)//trace(c.currentFrame)//错误1119:通过静态类型flash的引用访问可能未定义的属性currentFrame。显示:Sprite。跟踪(c[“currentFrame”])
您有错误,因为c来自类型Sprite,并且它没有方法currentFrame。正如我在开始时所说的,展示其他人可以从这个对象访问什么(简单地说)。变量c:Sprite=Sprite(mc);->表示将内存地址(mc)的内容视为精灵。