3

OK、これら2つのクラス(foobar)をそれぞれ独自の.ASファイルに作成しました。これらのクラスは両方とも、というパッケージに保存されましたcustom

「Sandbox」と呼ばれる.FLAファイルで、次のコードをタイムラインに配置しました。

import custom.foo;
import custom.bar;

var f:foo = new foo("FOO");
var b:bar = new bar("BAR");

trace(f.valueOf());
trace(b.valueOf());

f.statement();
b.statement();

次の出力が得られました。

FOO

バー

ステートメント:値はFOOです

ステートメント:値はBARです

さて、通常、私はこれについてあまり考えませんが、クラスのコードを見てください...これがfoo.asファイルです(私のコメントを除いて):

package custom {
        
    public class foo {

        public var property:String;
        public var value:String;

        public function foo (par:String = "?") {
            this.property = par;
            this.value = this.valueOf();
            return;
        }

        prototype.expression = function () {
            trace ("Expression: the value is", this.property);
        }

        public function statement () {
            trace ("Statement: the value is", this.property);
        }

        public function valueOf() {
            return(this.property);
        }

    }
}

...そしてここにbar.asファイルがあります(私のコメントを除いて):

package custom {
        
    public class bar {
        public var property:String;
        public var value:String;

        public function bar (par:String = "?") {
            prototype.property = par;
            prototype.value = prototype.valueOf();
            return;
        }

        prototype.expression = function () {
            trace ("Expression: the value is", prototype.property);
        }

        public function statement () {
            trace ("Statement: the value is", prototype.property);
        }

        public function valueOf() {
            return(prototype.property);
        }

    }
}

prototype代わりに使用したときに同じ結果が得られたのはなぜthisですか?prototypeこれは厄介な質問ですが、誰かが実際の意味を教えてくれない限り、答えることはできません。

this大まかに「このクラスのこのインスタンス」に変換されることは知っていますが...どういうprototype意味ですか?

4

3 に答える 3

2

ActionScript 3 は、JavaScript と同じ標準を指定する ECMAScript 仕様 (正式には ECMA-262) に基づいています。

基本的に、仕様prototypeでは、オブジェクトのプロパティを、 で作成されたときにそのオブジェクトの新しいインスタンスの初期プロパティを定義する一種の青写真として説明しますnewは、 の舞台裏のプロセス中に各インスタンスにコピーされるprototype任意のフィールドとメソッド (または必要に応じて) の定義を保持するクラス オブジェクトとして理解できます。functionnew

メソッドを呼び出すか、フィールドにアクセスするprototypeと、元の関数が呼び出されるか、インスタンスにコピーされたメソッドまたはフィールドではなく、「クラス」オブジェクトの元のフィールドにアクセスします。したがって、 と からは常に同じ値が得られますが、とはそれぞれ で作成された とのインスタンスであるため、とはprotoype.property異なります。f.propertyb.propertyfoobarnew

ActionScript に戻る

知っておくべきいくつかの特別な動作prototypeは次のとおりです。

まず、プロトタイプ メンバーと通常メンバーの使用の違いを説明する 3 つの例を次に示します。

public class Sample {

    public function Sample() {
        trace("this.test():", this.test()); // output: this.test(): member test
        trace("this["test"]():", this["test"]()); // output: this["test"](): member test
    }

    public function test():String {
        return "member test";
    }
}


public class SampleWithPrototype {

    public function SampleWithPrototype() {
        trace("this.test():", this.test()); // COMPILER ERROR: there is no member 'test' defined.
        trace("this["test"]():", this["test"]()); // output: this["test"](): prototype test
    }

    prototype.test = function():String {
        return "prototype test";
    }
}


public class SampleWithBoth {

    public function SampleWithBoth() {
        trace("this.test():", this.test()); // output: this.test(): member test
        trace("this["test"]():", this["test"]()); // output: this["test"](): member test
    }

    public function test():String {
        return "member test";
    }

    prototype.test = function():String {
        return "prototype test";
    }
}

説明:prototypeオブジェクトのコピーされたインスタンス プロパティは、添字演算子 (this["test"]例では) を使用してのみインスタンスでアクセスできます。それらはコンパイル時にチェックされず、この方法でのみアクセスできます。-表記でアクセスすると.、コンパイル時エラーが発生します ( SampleWithPrototype)。

を使用prototypeしてメンバーを定義する場合と、 のような通常のメンバー定義メカニズムを使用してメンバーを定義する場合public function ...、通常の定義済みメンバーはprotopype-member をシャドウするため、アクセスできなくなります ( SampleWithBoth)。

さらにprototype.test、実行時に必要なものを上書きできるため、上書き後にクラスから作成された各インスタンスtestが新しい動作を提供します。また、クラスを でマークする必要はありませんdynamic

最後に、この機能の使用はお勧めしません。アプリケーションが予測不能になり、デバッグが困難になる可能性があるためです。prototypeコンパイラを (はるかに遅い) ECMA-Standard モード (厳密でないモード) に切り替えない限り、ActionScript でを使用することは一般的ではありません。そうすると、JavaScript の場合と同じ動作が得られます。

于 2013-03-17T15:27:42.760 に答える
0

公式ドキュメントによると:

[最上位] Object.prototype

クラスまたは関数オブジェクトのプロトタイプ オブジェクトへの参照。プロトタイプ プロパティは自動的に作成され、作成したクラスまたは関数オブジェクトにアタッチされます。このプロパティは、作成するクラスまたは関数に固有であるという点で静的です。たとえば、クラスを作成する場合、プロトタイプ プロパティの値はクラスのすべてのインスタンスで共有され、クラス プロパティとしてのみアクセスできます。クラスのインスタンスは、prototype プロパティに直接アクセスできません。

クラスのプロトタイプ オブジェクトは、クラスのすべてのインスタンス間で状態を共有するメカニズムを提供する、そのクラスの特別なインスタンスです。実行時にクラス インスタンスでプロパティが見つからない場合、デリゲート (クラス プロトタイプ オブジェクト) でそのプロパティがチェックされます。プロトタイプ オブジェクトにプロパティが含まれていない場合、プロセスは、Flash ランタイムがプロパティを見つけるまで、階層内の上位レベルでプロトタイプ オブジェクトのデリゲート チェックを続行します。

注意:ActionScript 3.0 では、プロトタイプの継承は継承の主要なメカニズムではありません。クラス定義で固定プロパティの継承を駆動するクラス継承は、ActionScript 3.0 の主要な継承メカニズムです。

于 2013-03-17T04:47:58.067 に答える
0

AS3 と Javascript はどちらも同じECMAScriptから派生しています。

ここに画像の説明を入力

javascript では、プロトタイプは、オブジェクトを拡張し、オブジェクト指向 JS を作成する唯一の手段として存在します。

AS3にも同じ意味で存在しますが、AS3ではアドビがクラス構造を書いたため、プロトタイプの使用が途絶えました。したがって、AS3 では、C#/Java などの一般的な oop 言語と同じように、クラスを作成して操作します。

于 2013-03-17T06:48:17.713 に答える