dynamic instance란?
다이내믹 변수란 다이내믹 클래스로 생성 된 혹은 생성자 함수로 생성된(생성자 함수로 생성된 객체는 Object를 참조 함-->Object는 dynamic class) 객체에 선언하지 않았던 변수를 임의로 대입, 수정 가능하단 것이다. 이것은 런타임 시에 객체를 동적으로 수정 가능하도록 되어있다는 말이다.

생성자 함수란?
생성자는 class 를 인스턴스 생성할 경우 최초로 실행되는 부분으로 써 클래스명과 동일한 메서드라는거 다들 아신다.
그렇다면 생성자 함수란 또 뭔가…?
같은 말 아닌가 하겠지만 생성자 함수란 class를 통한 객체 생성 보다 함수 클로져를 독립적으로 사용하여 만들 수 있는 또 하나의 방법이다.
static 변수인 prototype 사용하기
액션스크립트의 모든 함수엔 prototype 변수를 정의하고 있는데 이것을 이용해 객체에 변수를 추가 할 수도 있고 동일한 행동을 수행하게 할 수도 있다. 단 컴파일 시에 strictly mode일 경우 dynamic class가 아닌 sealed class로 객체 생성한 instance 일 경우엔 에러가 발생되기도 한다.
동적 접근 표현식
위의 문제 상황에 닥쳤을 경우 동적 접근법을 이용함으로써 에러 상황을 벗어날 수 가 있다.
someobject.someproperty 가 아닌 …
someobject[someproperty] 로 접근할 경우 런타임 시에 동적으로 접근하겠다는 선언을 컴파일러는 인식하고 넘어가주게 된다.
동적 instance 의 우선 순위
기존의 있던 instance를 prototype으로 또 대입을 하게 되면 동적 instance에 대한 수정 값이 나오는 것이 아니라 기존의 객체의 변수 값이 나오게 된다.
prototype에 대한 상속
prototype은 해당 객체에 대한 참조를 떠나서 더 광범위한 영향력을 행사한다.
하위 클래스에서 부모 클래스에 prototype으로 인스턴스 변수를 추가할 경우 하위 클래스도 추가된 인스턴스 변수로 접근이 가능하다는 것이다. 또한 생성자 함수의 경우에도 prototype으로 추가된 변수를 다른 생성자 함수의 변수로 대입이 가능하다.
main.as
package {
import flash.display.Sprite;
import scope.City;
public class main extends Sprite
{
public function main()
{
// 생성자 함수
function funcConstructor(name:String,num:Number):void
{
//
this.name=name;
this.num=num;
}
// 생성자 함수에 공통으로 dynamic 인스턴스 추가 방법
// 기존의 name과 num만 있던 것에 company가 추가되었다.
funcConstructor.prototype.company="minossi";
// 각 생성자 함수를 통해서 여러개의 객체를 생성할 수 있다.
var instance:Object=new funcConstructor("zome",1234);
var inst2:Object=new funcConstructor("but",345);
trace(instance.name);
trace(instance.num);
trace(instance.company);
instance.company="hello";
trace(instance.company);
trace(inst2.name);
// 각기 다른 객체는 각각 변수에 저장 됨
// 값이 hello가 아닌 minossi가 들어온다.(초기화)
trace(inst2.company);
// prototype을 이용한 클래스 수정
// 기존의 City Class에는 address에 대한 정의가 있다.
City.prototype.address=function():String{
return "tokyo";
}
// 기존의 없던 property를 추가 하였다.
City.prototype.id=function():Number{
return 777;
}
var city:City=new City();
trace(city.address);//정상적인 접근법
trace(city["address"]);//위의 prototype이 아닌 seoul이 찍힘
//trace(city["address"]()); //기존의 property가 있기에 에러
trace(city["id"]());//id가 추가가 되고 777이 찍힘
trace(city["id"]);//function Function() {} 이 찍힘
}
}
}
City.as
package scope
{
public class City
{
public var address:String="seoul";
}
}




