__resolve(Object.__resolve 속성)

public __resolve : 객체

ActionScript 코드에서 정의되지 않은 속성이나 메서드를 참조할 경우 호출되는 사용자 정의 함수에 대한 참조입니다. ActionScript 코드에서 객체의 정의되지 않은 속성이나 메서드를 참조할 경우 Flash Player는 객체의 __resolve 속성이 정의되어 있는지 확인합니다. __resolve가 정의되어 있으면 이 속성에서 참조하는 함수가 실행되고 정의되지 않은 속성이나 메서드의 이름이 함수에 전달됩니다. 이러한 방법을 사용하면 정의되지 않은 속성에 대한 값이나 정의되지 않은 메서드에 대한 명령문을 프로그래밍 방식으로 제공하고 속성이나 메서드가 실제로 정의된 것처럼 보이게 할 수 있습니다. 이 속성은 매우 투명한 클라이언트/서버 통신을 활성화하는 데 유용하며 서버측 메서드를 호출하는 데 좋은 방법입니다.

지원 버전: ActionScript 1.0, Flash Lite 2.0

예제

다음 예제들은 첫 번째 예제를 기반으로 점진적으로 구성한 것으로, __resolve 속성의 5가지 구문을 보여 줍니다. 이해를 돕기 위해 이전 구문과는 다른 주요 명령문은 굵은 서체로 표시됩니다.

구문 1: 다음은 __resolve를 사용하여 정의되지 않은 모든 속성이 "Hello, world!"라는 값을 반환하는 객체를 구성하는 예제입니다.

// 새 객체를 인스턴스화합니다.
var myObject:Object = new Object();

// __resolve 함수를 정의합니다.
myObject.__resolve = function (name) {
    return "Hello, world!";
};
trace (myObject.property1); // 출력: Hello, world!
trace (myObject.property2); // 출력: Hello, world!

구문 2: 다음은 함수를 생성하는 함수인 functor로 __resolve를 사용하는 예제입니다. __resolve를 사용하면 정의되지 않은 메서드 호출이 myFunction이라는 일반 함수로 리디렉션됩니다.

// 새 객체를 인스턴스화합니다.
var myObject:Object = new Object();

// 호출할 __resolve에 대한 함수를 정의합니다.
myObject.myFunction = function (name) {
    trace("Method " + name + " was called");
};

// __resolve 함수를 정의합니다.
myObject.__resolve = function (name) {
     return function () { this.myFunction(name); };
};

// 정의되지 않은 메서드 이름을 사용하여 __resolve를 테스트합니다.
myObject.someMethod(); // 출력: Method someMethod was called
myObject.someOtherMethod(); //출력: Method someOtherMethod was called

구문 3: 다음 예제는 이전 예제에 확인된 메서드를 캐시하는 기능을 추가한 것입니다. 메서드를 캐시하여 해당 메서드마다 __resolve를 한 번만 호출합니다. 이렇게 하면 객체 메서드의 지연 구성이 가능합니다. 지연 구성은 메서드를 처음으로 사용하는 시점까지 메서드의 생성이나 구성을 연기하는 최적화 기술입니다.

// 새 객체를 인스턴스화합니다.
var myObject:Object = new Object();
// 호출할 __resolve에 대한 함수를 정의합니다.
myObject.myFunction = function(name) {
    trace("Method "+name+" was called");
};
// __resolve 함수를 정의합니다.
myObject.__resolve = function(name) {
    trace("Resolve called for "+name); // __resolve가 언제 호출되는지 검사합니다.
    // 함수를 호출할 뿐 아니라 함수에 대한 참조를 저장하기도 합니다.
    var f:Function = function () {
        this.myFunction(name);
    };
    // 새 객체 메서드를 만들고 이 메서드에 대한 참조를 지정합니다.
    this[name] = f;
    // 참조를 반환합니다.
    return f;
};
// 정의되지 않은 메서드 이름을 사용하여 __resolve를 테스트합니다.
// __resolve는 각 메서드 이름에 대해 한 번씩만 호출됩니다.
myObject.someMethod(); // __resolve를 호출합니다.
myObject.someMethod(); // 이제 정의되어 있으므로 __resolve를 호출하지 않습니다.
myObject.someOtherMethod(); // __resolve를 호출합니다.
myObject.someOtherMethod(); // 더 이상 정의되지 않은 상태가 아니므로 __resolve를 호출하지 않습니다.

구문 4: 다음 예제는 로컬 사용에 대해 onStatus()라는 메서드 이름을 예약하여, 정의되지 않은 다른 속성과 같은 방법으로 이 메서드를 확인할 수 없도록 한 것입니다. 추가된 코드는 굵은 서체로 되어 있습니다.

// 새 객체를 인스턴스화합니다.
var myObject:Object = new Object();
// 호출할 __resolve에 대한 함수를 정의합니다.
myObject.myFunction = function(name) {
    trace("Method "+name+" was called");
};
// __resolve 함수를 정의합니다.
myObject.__resolve = function(name) {
    // 로컬 컴퓨터용으로 "onStatus" 이름을 예약합니다.
    if (name == "onStatus") {
        return undefined;
    }
    trace("Resolve called for "+name); // __resolve가 언제 호출되는지 검사합니다.
    // 함수를 호출할 뿐 아니라 함수에 대한 참조를 저장하기도 합니다.
    var f:Function = function () {
        this.myFunction(name);
    };
    // 새 객체 메서드를 만들고 이 메서드에 대한 참조를 지정합니다.
    this[name] = f;
    // 참조를 반환합니다.
    return f;
};
// 메서드 이름 "onStatus"를 사용하여 __resolve를 테스트합니다.
trace(myObject.onStatus("hello"));
// 출력: undefined

구문 5: 다음 예제는 이전 예제에 매개 변수를 받아들이는 functor를 만든 것입니다. 이 예제에서는 인수 객체를 광범위하게 사용하고 Array 클래스의 여러 메서드를 사용합니다.

// 새 객체를 인스턴스화합니다.
var myObject:Object = new Object();

// 호출할 __resolve에 대한 일반 함수를 정의합니다.
myObject.myFunction = function (name) {
    arguments.shift();
    trace("Method " + name + " was called with arguments: " + arguments.join(','));
};

// __resolve 함수를 정의합니다.
myObject.__resolve = function (name) {
    // 로컬 컴퓨터용으로 "onStatus" 이름을 예약합니다.
    if (name == "onStatus") {
        return undefined;
    }
    var f:Function = function () { 
        arguments.unshift(name);
        this.myFunction.apply(this, arguments); 
    };
    // 새 객체 메서드를 만들고 이 메서드에 대한 참조를 지정합니다.
    this[name] = f;
    // 함수에 대한 참조를 반환합니다.
    return f;
};

// 매개 변수가 있는 정의되지 않은 메서드 이름을 사용하여 __resolve를 테스트합니다.
myObject.someMethod("hello");
// 출력: Method someMethod was called with arguments: hello

myObject.someOtherMethod("hello","world");
// 출력: Method someOtherMethod was called with arguments: hello,world

참고 사항

arguments, Array