ตัวดำเนินการ ActionScript เป็น

ใครบ้างมีคำอธิบายที่ดีเกี่ยวกับตัวดำเนินการ as

สำหรับฉันแล้วดูเหมือนว่าการใช้ as มักจะดีกว่าแทนที่จะสร้างอินสแตนซ์ของวัตถุใหม่

แต่มีบางสถานการณ์ที่โอเปอเรเตอร์นี้ทำให้ฉันผิดหวัง ตัวอย่างเช่น เมื่อโหลดไฟล์ข้อความในรูปแบบ XML ผ่าน URLLoader:

private function completeHandler(event:Event):void {
    var loader:URLLoader = URLLoader(event.target);
    trace("completeHandler: " + loader.data);

    var x:XML = new XML(loader.data);
    trace("x=" + x);
}

ทำไมฉันต้องใช้ตัวสร้างที่นี่? เหตุใดฉันจึงไม่สามารถพูด var x:XML = loader.data as XML; และบันทึกหน่วยความจำบางส่วนไม่ได้

ขอบคุณสำหรับข้อมูลเชิงลึก! อเล็กซ์


person Alexander Farber    schedule 21.02.2011    source แหล่งที่มา
comment
ลองด้วย var x:XML = new XML(loader.data);   -  person Cay    schedule 21.02.2011
comment
ใช่ขอบคุณ นั่นเป็นการพิมพ์ผิดในคำถามของฉัน   -  person Alexander Farber    schedule 21.02.2011


คำตอบ (1)


as ประเมินว่าประเภทของตัวแปรเป็นคลาสซุปเปอร์หรือคลาสย่อยของคลาสอื่น มันไม่ได้สร้างวัตถุใหม่ ความแตกต่างกับ is คือในขณะที่ is ส่งคืนค่าบูลีน แต่ as จะส่งคืนออบเจ็กต์ประเภทที่ต้องการหรือ null ใช้สำหรับหล่อประเภท

ดูเอกสารประกอบ ActionScript

กรณีการใช้งานทั่วไปคือการใช้ MovieClip ในพื้นที่งาน ซึ่งดึงข้อมูลตามชื่ออินสแตนซ์:

// This will not compile:
var d:DisplayObject = stage.getChildByName ("instance1"); 
d.gotoAndPlay (2);

// This will play the MovieClip from frame 2
var m : MovieClip = stage.getChildByName ("instance1") as MovieClip;
m.gotoAndPlay (2); 

stage.getChildByName() ส่งคืน DisplayObject เสมอ ไม่ว่าจะเป็น MovieClip, Sprite, Button ฯลฯ ก็ตาม ดังนั้นหากคุณต้องการใช้วิธีการของคลาส MovieClip คุณต้องพิมพ์ Cast ไปที่ MovieClip ก่อน อย่างไรก็ตาม สิ่งนี้ไม่ได้สร้าง MovieClip ใหม่ แต่เพียงทำให้แน่ใจว่าคุณใช้ประเภทที่ถูกต้อง

person weltraumpirat    schedule 21.02.2011
comment
+1 นอกจากนี้ @Alexander Farber คุณสามารถส่งด้วยสัญกรณ์ต่อไปนี้ var m : MovieClip = MovieClip(stage.getChildByName (instance1)); ข้อแตกต่างคือหากการส่งไม่สำเร็จ ข้อผิดพลาดรันไทม์จะถูกส่งออกไป ในทางตรงกันข้าม ตัวดำเนินการ as จะส่งกลับค่าว่าง - person Allan; 21.02.2011
comment
ขอบคุณ. คำอธิบายว่าทำไมฉันถึงได้รับค่าว่างในตัวอย่างของฉัน: var x:XML = loader.data as XML; ? - person Alexander Farber; 21.02.2011
comment
โดยปกติแล้ว loader.data ไม่ใช่ออบเจ็กต์ XML (แม้ว่าจะมีข้อความ xml ก็ตาม) หากคุณเขียน XML(loader.data) คุณกำลังใช้ตัวดำเนินการระดับบนสุด XML() ซึ่งรับข้อความและสร้างอ็อบเจ็กต์ XML จากตัวดำเนินการดังกล่าว - person alxx; 21.02.2011