[Actionscript] About prototype on redgoose note

[Actionscript] About prototype

Nest: Development Category: ETC 2013-03-16

클래스 객체나 함수객체를 컨트롤 할 수 있는것이 prototype객체이다. 사용구조는 아래와 같다.

ObjectName.prototype.valueName = "value";
ObjectName.prototype.methodName = function() { };

as2.0에서는 MovieClip.prototype.methodName = function() { }으로 사용해왔는데 형태는 동일하다.
여태까지는 MovieClip이나 String같은 기본객체를 통하여 prototype객체를 만들고 instance.methodName(); 형태로 호출한다. 역시나 as2.0이나 3.0이나 사용형태는 동일한다.

활용 형태는 아래의 예제코드를 참고해야한다.

prototype 객체를 사용하여 클래스 수정하기 예제

// 함수 만들기
function Employee():void {
  this.age = 20;
  this.salary = 2000;
}
var worker = new Employee(); // Employee함수로 worker라는 인스턴스를 새로 만든다.

trace(worker.age); // work객체의 age 속성값 호출. "20"출력

Employee.prototype.company = "Google corp"; // Employee 프로토타입을 이용하여 값넣기
worker.com2 = "concon"; // 인스턴스를 통하여 값넣기

trace(worker.company); // "Google corp" 출력
trace(worker.com2); // "concon" 출력

trace("------------------------");

var worker2 = new Employee(); // Employee함수로 worker2라는 인스턴스를 새로 만든다.
trace(worker2.company); // "Google corp" 출력
trace(worker2.com2); // undefined  출력.

// Employee함수에서 getBonus라는 메서드 만들기.
Employee.prototype.getBonus = function(percentage:int):Number {
  return this.salary * (percentage / 100);
}

trace(worker.getBonus(10)); // "200" 출력

추가설명

  • 모든 클래스에 대해서 static prototype변수를 정의하고 있다.
  • String 클래스에서 prototype객체 정의하기
String.prototype.isEmpty = function() {
    return (this == "") ? true : false;
}

prototype의 isEmpty()메서드를 호출하려면 아래와 같은 코드를 사용한다.

var s1:String = "Hello world";
var s2:String = "";

trace(s1.isEmpty()); // "false"출력
trace(s2.isEmpty()); // "true"출력

위와같은 형태의 호출은 에러를 뿜어낼 수 있기 때문에 아래와같이 대체해본다.

s1["isEmpty"]();

prototype 체인 예제

// Employee()를 생성하고 prototype으로 company변수를 지정한다.
function Employee() { }
Employee.prototype.company = "Corp";

// 연결시킬 Manager()를 생성한다.
function Manager() { }

// Employee()로부터 생성되는 객체를 Manager()의 prototype변수에 대입한다.
Manager.prototype = new Employee();

// worker 인스턴스를 만들고 Employee()에서 접근할 수 있는지 확인한다.
var worker = new Manager();
trace(worker.company); // "Corp" 출력

prototype 체인에 대하여

  • 위의 예제에서 company변수를 찾아다니는 여정은 다음과 같다.
    1. worker객체에 대해 company 변수를 찾지만 찾지 못한다.
    2. Manager.prototype에서 company변수를 찾지만 찾지 못한다.
    3. Manager.prototype은 Employee()로부터 생성되므로, Employee에서 company변수를 찾는다.
  • 변수의 값을 정할 때 액션스크립트에서 검색하는 prototype 객체들의 목록을 prototype 체인이라고 부른다.
  • prototype체인에서의 제약사항
    1. prototype 변수에 대입된 객체는 그 자체가 함수로부터 생성된 객체이거나 Object 클래스의 인스턴스여야한다.
    2. 클래스의 prototype 변수의 값은 액션스크립트에 의해서 자동으로 설정되며 재설정할 수 없다.