2

ダーツの関数にプロパティを追加できますか? 私はこれを試しました:

void main(){

    fn(){
        //DoSomething
    };

    fn.id = 1; //Exception NoSuchMethod

}

NoSuchMethod 例外がスローされるようにするためだけに。javascriptのように、実行時に関数または任意のタイプのオブジェクトにプロパティを追加する方法はありますか?

(また、プロパティに割り当てているときに、そのようなメソッド例外がないと言っているのはなぜですか?)

4

3 に答える 3

4

Functionにプロパティを追加することはできません。ただしObject、関数のように呼び出すことができる を定義できます ( Dart での関数のエミュレートを参照)。例を次に示します。

class WannabeFunction {
  var id;
  call(int a, int b) => a + b;
}

main() {
  var wf = new WannabeFunction();
  wf.id = 1;
  wf(3, 4); // 7
}

の場合NoSuchMethodError: を使用fn.id = 1すると、実際には暗黙のセッターid=を呼び出しますfn。そのため、このエラーが発生します。

于 2013-05-08T21:08:54.420 に答える
1

オブジェクトのメンバーを追加または削除することはできません。概念的には、オブジェクトは、そのクラス記述へのポインタと、その状態を格納するためのメモリを備えた小さな構造です。クラス記述は、割り当てポイントでの構造のレイアウトを定義します。クラスの説明にフィールドが含まれていない場合id(例のように)、それを追加する方法はありません。クラスの説明を変更することも、実際のインスタンスを変更することもできません (そのため、余分なフィールド用により多くのメモリが確保されます)。これは面倒かもしれませんが (特にオブジェクトを動的に変更することに慣れている JavaScript ユーザーにとっては)、プログラマーに一定の保証を与え、最適化を容易にします。オブジェクトはより少ないメモリを使用し、最適化コンパイラは、そうでなければ成り立たない仮定を行うことができます。

ただし、expandosを使用して側面からプロパティを追加する方法があります。

于 2013-05-09T10:57:30.687 に答える