
ActionScript 1.0'a kadar ActionScript programcıları, sınıflara benzeyen yapılar oluşturmak için Function nesnelerini kullanabilirdi. ActionScript 2.0 ise class ve extends gibi anahtar sözcüklerle sınıflar için biçimsel destek ekledi. ActionScript 3.0, hem ActionScript 2.0'da ilk defa sunulan anahtar sözcüklerini desteklemeye devam eder hem de protected ve internal nitelikleriyle gelişmiş erişim denetimi ve final ve override anahtar sözcükleriyle miras üzerinden daha iyi denetim gibi yeni yetenekler de içerir.
ActionScript 3.0, önceki ActionScript sürümlerinin komut dosyası oluşturma yeteneklerinden çok daha fazlasını sunar. Büyük veri kümeleri ve nesne tabanlı, yeniden kullanılabilir kod tabanları ile oldukça karmaşık uygulamaların oluşturulmasını kolaylaştırmak üzere tasarlanmıştır. ActionScript 3.0, Adobe Flash Player uygulamasında çalışan içerik için gerekmese de, yalnızca yeni sanal makine olan AVM2 ile kullanılabilen performans artışına bir kapı açar. ActionScript 3.0 kodu, eski ActionScript kodundan on kata kadar daha hızlı çalışabilir.
Eski ActionScript Virtual Machine sürümü olan AVM1, ActionScript 1.0 ve ActionScript 2.0 kodunu çalıştırır. Varolan ve eski içerikle geriye doğru uyumluluk sağlamak için Flash Player 9 ve 10 tarafından AVM1 desteklenir.
Çalışma zamanı istisnaları
ActionScript 3.0, önceki ActionScript sürümlerinden daha çok hata koşulu bildirir. Yaygın hata koşulları için çalışma zamanı istisnaları kullanılarak hata ayıklama deneyimini geliştirir ve hataları daha güçlü şekilde işleyen uygulamalar geliştirmenizi sağlar. Çalışma zamanı hataları, kaynak dosya ve satır numarası bilgilerini ek açıklama olarak veren yığın izleri sağlayarak hızlı şekilde hataların yerini belirlemenize yardımcı olur.
Çalışma zamanı türleri
ActionScript 2.0'da tür ek açıklamaları birincil olarak geliştiriciye yardım sağlama amaçlıydı; çalışma zamanında tüm değerler dinamik olarak türlenmiştir. ActionScript 3.0'da, tür açıklamaları çalışma zamanında korunur ve birçok amaç için kullanılır. Flash Player ve Adobe AIR, çalışma zamanı, çalışma zamanı tür denetlemesi uygulayarak sistemin tür güvenliğini artırır. Tür bilgileri aynı zamanda yerel makine temsillerinde değişkenleri temsil etmek için de kullanılarak performansı artırır ve bellek kullanımını azaltır.
Mühürlenmiş sınıflar
ActionScript 3.0, mühürlenmiş sınıf kavramını getirmiştir. Mühürlenmiş bir sınıf, derleme zamanında tanımlanmış yalnızca sabit özellikler ve yöntemler kümesine sahiptir; bu sınıfa ek özellikler ve yöntemler eklenemez. Bu da daha katı derleme zamanı denetlemesi sağlayarak daha güçlü programlar oluşmasına neden olur. Buna ek olarak, nesne örneklerinin her biri için dahili bir karma tablo gerektirmeyerek bellek kullanımını da azaltır. dynamic anahtar sözcüğünün kullanılmasıyla dinamik sınıflar da mümkündür. ActionScript 3.0'daki tüm sınıflar varsayılan olarak mühürlenmiştir ancak dynamic anahtar sözcüğüyle bu sınıfların dinamik olduğu bildirilebilir.
Yöntem kapanışı
ActionScript 3.0, yöntem kapanışının otomatik olarak orijinal nesne örneğini hatırlamasına olanak sağlar. Bu özellik, olay işlemesi için kullanışlıdır. ActionScript 2.0'da, yöntem kapanışları hangi nesne örneğinden ayıklandıklarını hatırlamaz ve bu da yöntem kapanışı çağrıldığında beklenmeyen davranış oluşmasına neden olur. mx.utils.Delegate sınıfı sık kullanılan bir geçici çözümdür ancak artık buna ihtiyaç kalmamıştır.
XML için ECMAScript (E4X)
ActionScript 3.0, en son ECMA-357 olarak standartlaştırılmış olan XML için ECMAScript (E4X) uygular. E4X, XML'in işlenmesi için doğal ve akıcı bir dil yapıları kümesi sunar. Geleneksel XML ayrıştırma API'lerinin tersine, E4X ile XML, dilin yerel bir veri türüymüş gibi hareket eder. E4X, ihtiyaç duyulan kod miktarını büyük ölçüde azaltarak XML'i işleyen uygulamaların geliştirilmesini kolaylaştırır.
ECMA’nın E4X belirtimini görüntülemek için: http://www.ecma-international.org/ .
Normal ifadeler
ActionScript 3.0, hızlı şekilde dizeleri arayabilmeniz ve işleyebilmeniz amacıyla normal ifadeler için yerel destek içerir. ECMAScript (ECMA-262) sürüm 3 dil belirtiminde belirtildiği şekilde ActionScript 3.0, normal ifadeler için destek uygular.
Ad alanları
Ad alanları, bildirimlerin görünürlüğünü (public, private, protected) kontrol etmek için kullanılan geleneksel erişim belirticilerine benzer. Bunlar, seçtiğiniz adlara sahip olabilen özel erişim belirticileri olarak çalışır. Çakışmaları önlemek için, ad alanlarında bir Universal Resource Identifier (URI) bulunur ve E4X ile çalıştığınızda XML ad alanlarını temsil etmek için de ad alanları kullanılır.
Yeni ilkel türler
ActionScript 2.0, Number adında, çift kesinlikli ve kayan nokta sayısı olan tek bir sayısal türe sahiptir. ActionScript 3.0, int ve uint türlerini içerir. int türü, ActionScript'in CPU için hızlı tam sayı matematik yeteneklerinden faydalanmasına olanak sağlayan 32-bit işaretli bir tam sayıdır. int türü, döngü sayaçları ve tam sayıların kullanıldığı değişkenler için kullanışlıdır. uint türü, RGB renk değerleri, bayt sayıları ve daha fazlası için kullanışlı olan işaretsiz, 32-bit tam sayı türüdür.
Daha çok Java ve C++ ile ilişkilendirilmiş olan yaygın bir nesne tabanlı programlama paradigması, nesne türlerini tanımlamak için sınıfları kullanır. Bu paradigmayı kullanan programlama dilleri, sınıfın tanımladığı veri türü örneklerini oluşturmak için de sınıfları kullanabilir. ActionScript, sınıfları bu iki amaç için de kullanır ancak ActionScript'in prototip tabanlı bir dil olması da ilginç bir özellik katar. ActionScript, her sınıf tanımı için, hem davranışın hem de durumun paylaşılmasına olanak sağlayan özel bir sınıf nesnesi oluşturur. Ancak birçok ActionScript programcısı için bu ayrım pratik bir kodlama anlamına gelmeyebilir. ActionScript 3.0, bu özel sınıf nesnelerini kullanmadan hatta anlamadan karmaşık nesne tabanlı ActionScript uygulamaları oluşturabileceğiniz şekilde tasarlanmıştır.
Diyagramda, A adındaki basit bir sınıfı temsil eden bir sınıf nesnesi yapısını göstermektedir. A sınıfı, class A {} deyimiyle tanımlanmıştır.Diyagramdaki her dikdörtgen bir nesneyi temsil eder. Diyagramdaki her nesne, A sınıfına ait olduğunu temsil eden bir A alt simge karakterine sahiptir. Sınıf nesnesi (CA), birçok başka önemli nesneye başvuruları içerir. Örnek nitelikleri nesnesi (TA), bir sınıf tanımı içinde tanımlanan örnek özelliklerini saklar. Sınıf nitelikleri nesnesi (TCA), dahili sınıf türünü temsil eder ve sınıf tarafından tanımlanan statik özellikleri saklar (C alt simge karakteri "sınıfı" ifade eder). Prototip nesnesi (PA) her zaman başlangıçta constructor özelliği yoluyla eklendiği sınıf nesnesini ifade eder.
Nitelikler nesnesi
ActionScript 3.0'da yeni bir özellik olan nitelikler nesnesi, performans göz önünde tutularak uygulanmıştır. Önceki ActionScript sürümlerinde, Flash prototip zincirinde dolandığı için ad arama zaman alıcı bir işlem olabiliyordu. ActionScript 3.0'da, miras alınan özellikler, üst sınıflardan alt sınıfların nitelikler nesnesine kopyalandığından, ad arama çok daha etkili olup daha az zaman alır.
Nitelikler nesnesine programcı kodu ile doğrudan erişilemez ancak performans artışı ve bellek kullanımındaki iyileşme ile bu nesnenin varlığı hissedilebilir. Nitelikler nesnesi, bir sınıfın mizanpajı ve içerikleri hakkında ayrıntılı bilgi içeren AVM2'yi sağlar. Bu bilgiler sayesinde AVM2, zaman alıcı bir işlem olan ad aramasına gerek kalmadan özelliklere erişmeye veya yöntemler çağırmaya yönelik doğrudan makine talimatları oluşturabildiğinden, çalıştırma süresini büyük ölçüde azaltabilir.
Nitelikler nesnesi sayesinde nesnenin bellek izi, önceki ActionScript sürümlerindeki benzer bir nesnenin bellek izinden çok daha küçük olabilir. Örneğin, bir sınıf mühürlenmişse (başka bir deyişle, sınıfın dinamik olduğu bildirilmemişse), o sınıfın örneği, dinamik olarak eklenmiş özelliklerin karma tablosunu gerektirmez ve nitelikler nesnelerinin işaretçilerinden ve sınıfta tanımlanmış sabit özelliklere yönelik birkaç yuvadan biraz daha fazlasını barındırabilir. Sonuç olarak, ActionScript 2.0'da 100 bayt bellek gerektiren bir nesne, ActionScript 3.0'da 20 bayt kadar düşük bellek gerektirebilir.
Not: Nitelikler nesnesi dahili bir uygulama olup, gelecek ActionScript sürümlerinde bu uygulamanın değişmeyeceğine veya tamamen kaldırılmayacağına dair bir garanti yoktur.
Prototip nesnesi
Her ActionScript sınıf nesnesi, sınıfın prototip nesnesine başvuru niteliğinde olan prototype adında bir özelliğe sahiptir. Prototip nesnesi, ActionScript’in prototip tabanlı dil olması nedeniyle eski uygulamasının devamı niteliğindedir. prototype özelliği salt okunur özelliktedir, başka bir deyişle, farklı nesnelere işaret edecek şekilde değiştirilemez. Bu da, prototipin farklı bir sınıfa işaret edecek şekilde yeniden atanabildiği önceki ActionScript sürümlerindeki prototype sınıfından farklılık gösterir. prototype özelliği salt okunur olsa da, bu özelliğin başvurduğu prototip nesnesi salt okunur değildir. Başka bir deyişle, prototip nesnesine yeni özellikler eklenebilir. Prototip nesnesine eklenen özellikler, sınıfın tüm örnekleri arasında paylaşılır.
Önceki ActionScript sürümlerinde tek miras mekanizması olan prototip zinciri, ActionScript 3.0'da yalnızca ikincil rol oynar. Birincil miras mekanizması olan sabit özellik mirası, nitelikler nesnesi tarafından dahili olarak işlenir. Sabit özellik, sınıf tanımının bir parçası olarak tanımlanan bir değişken veya yöntemdir. Sabit özellik mirası, class, extends ve override gibi anahtar sözcüklerle ilişkilendirilmiş miras mekanizması olduğundan, sınıf mirası olarak da adlandırılır.
Prototip zinciri, sabit özellik mirasından daha dinamik olan alternatif bir miras mekanizması sağlar. Yalnızca sınıf tanımının bir parçası olarak değil, aynı zamanda sınıf nesnesinin prototype özelliği üzerinden çalışma zamanında da sınıfın prototip nesnesine özellikler ekleyebilirsiniz. Ancak, derleyiciyi katı moda ayarlamanız durumunda, dynamic anahtar sözcüğüyle bir sınıf bildirmediğiniz sürece bir prototip nesnesine eklenmiş özelliklere erişemeyebileceğinizi unutmayın.
Prototip nesnesine birçok özellik eklenmiş olan sınıfa güzel bir örnek Object sınıfıdır. Object sınıfının toString() ve valueOf() yöntemleri, gerçekten Object sınıfının prototip nesnesinin özelliklerine atanmış işlevlerdir. Aşağıda, bu yöntemlerin bildirilmesinin teoride nasıl göründüğünü gösterir (uygulama ayrıntıları nedeniyle gerçek uygulama biraz daha farklıdır):
public dynamic class Object
{
prototype.toString = function()
{
// statements
};
prototype.valueOf = function()
{
// statements
};
}
Daha önceden belirtildiği gibi, sınıf tanımının dışında bir sınıfın prototip nesnesine bir özellik ekleyebilirsiniz. Örneğin, toString() yöntemi aşağıdaki gibi Object sınıfının dışında da tanımlanabilir:
Object.prototype.toString = function() { // statements };
Ancak sabit özellik mirasının aksine, prototip mirası, bir alt sınıfta yöntemi yeniden tanımlamak istediğinizde override anahtar sözcüğünü gerektirmez. Örneğin. Object sınıfının bir alt sınıfında valueOf() yöntemini yeniden tanımlamak istiyorsanız, üç seçeneğiniz vardır. İlk olarak, sınıf tanımının içinde alt sınıfın prototip nesnesinde bir valueOf() yöntemini tanımlayabilirsiniz. Aşağıdaki kod, Object sınıfının Foo adında bir alt sınıfını oluşturur ve sınıf tanımının bir parçası olarak Foo alt sınıfının prototip nesnesinde valueOf() yöntemini yeniden tanımlar. Her sınıf Object öğesinden miras aldığı için, extends anahtar sözcüğünün kullanılması gerekmez.
dynamic class Foo
{
prototype.valueOf = function()
{
return "Instance of Foo";
};
}
İkinci olarak, aşağıdaki kodda gösterildiği gibi, sınıf tanımının dışında Foo alt sınıfının prototip nesnesinde bir valueOf() yöntemini tanımlayabilirsiniz:
Foo.prototype.valueOf = function() { return "Instance of Foo"; };
Üçüncü olarak, Foo sınıfının parçası olarak valueOf() adında bir sabit özellik tanımlayabilirsiniz. Bu teknik, sabit özellik mirası ile prototip mirasını karma olarak kullandığından diğer tekniklerden farklıdır. valueOf() öğesini yeniden tanımlamak isteyen tüm Foo alt sınıflarının override anahtar sözcüğünü kullanması gerekir. Aşağıdaki kod, Foo'da sabit özellik olarak tanımlanan valueOf() öğesini gösterir:
class Foo { function valueOf():String { return "Instance of Foo"; } }
AS3 ad alanı
İki ayrı miras mekanizması, sabit özellik mirası ve prototip mirasının olması, çekirdek sınıfların özellikleri ve yöntemleriyle ilgili ilginç bir uyumluluk zorluğu oluşturur. ActionScript'in esas aldığı ECMAScript dil belirtimiyle uyumluluk için prototip mirasının kullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri o sınıfın prototip nesnesinde tanımlanır. Diğer yandan, ActionScript 3.0 ile uyumluluk için sabit özellik mirasının kullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri, const, var ve function anahtar sözcükleri kullanılarak sınıf tanımında tanımlanır. Üstelik, prototip sürümleri yerine sabit özelliklerin kullanılması, çalışma zamanı performansında önemli ölçüde artış sağlayabilir.
ActionScript 3.0, çekirdek sınıfları için hem prototip mirasını hem de sabit özellik mirasını kullanarak bu sorunu çözer. Çekirdek sınıfların her biri iki özellik ve yöntem kümesi içerir. Kümelerden biri, ECMAScript belirtimiyle uyumluluk sağlamak için prototip nesnesinde tanımlanırken, diğeri de ActionScript 3.0 ile uyumluluk sağlamak üzere sabit özellikler ve AS3 ad alanıyla tanımlanır.
AS3 ad alanı, iki özellik ve yöntem kümesi arasında seçim yapılmasına yönelik kullanışlı bir mekanizma sağlar. AS3 ad alanını kullanmazsanız, çekirdek sınıfın bir örneği, çekirdek sınıfın prototip nesnesinde tanımlanan özellikleri ve yöntemleri miras alır. Sabit özellikler her zaman prototip özelliklerden daha çok tercih edildiği için, AS3 ad alanını kullanmaya karar verirseniz, çekirdek sınıfın bir örneği AS3 sürümlerini miras alır. Başka bir deyişle, kullanılabilir bir sabit özellik olduğunda, aynı ada sahip olan prototip özelliği yerine her zaman bu sabit özellik kullanılır.
Bir özelliğin veya yöntemin AS3 ad alanı sürümünü AS3 ad alanıyla niteleyerek kullanabilirsiniz. Örneğin, aşağıdaki kod, Array.pop() yönteminin AS3 sürümünü kullanır:
var nums:Array = new Array(1, 2, 3);
nums.AS3::pop(); trace(nums); // output: 1,2
Alternatif olarak, bir kod bloğu içindeki tüm tanımlar için AS3 ad alanını açmak üzere use namespace direktifini kullanabilirsiniz. Örneğin, aşağıdaki kod, pop() ve push() yöntemleri için AS3 ad alanını açmak üzere use namespace direktifini kullanır:
use namespace AS3;
var nums:Array = new Array(1, 2, 3);
nums.pop();
nums.push(5);
trace(nums) // output: 1,2,5
ActionScript 3.0 ayrıca programınızın tamamına AS3 ad alanı uygulayabilmenizi sağlamak üzere her özellik kümesi için derleyici seçenekleri sağlar. -as3 derleyici seçeneği, AS3 ad alanını temsil ederken, -es derleyici seçeneği de prototip mirası seçeneğini (es, ECMAScript'i ifade eder) temsil eder. Programınızın tamamı için AS3 ad alanını açmak üzere, -as3 derleyici seçeneğini true değerine ve -es derleyici seçeneğini de false değerine ayarlayın. Prototip sürümlerini kullanmak için, derleyici seçeneklerini karşıt değerlere ayarlayın. Adobe Flex Builder 3 ve Adobe Flash CS4 Professional için varsayılan derleyici ayarları şunlardır: -as3 = true ve -es = false.
Herhangi bir çekirdek sınıfı genişletmeyi ve herhangi bir yöntemi geçersiz kılmayı planlıyorsanız, geçersiz kılınmış bir yöntemi nasıl bildirmeniz gerektiğini AS3 ad alanının nasıl etkileyebildiğini anlamanız gerekir. AS3 ad alanını kullanıyorsanız, çekirdek sınıf yönteminin herhangi bir yöntem geçersiz kılması, override niteliğiyle birlikte AS3 ad alanını da kullanmalıdır. AS3 ad alanını kullanmıyor ve bir alt sınıfta çekirdek sınıf yöntemini yeniden tanımlamak istiyorsanız, AS3 ad alanını veya override anahtar sözcüğünü kullanmamanız gerekir.