5

Dart では、関数にプロトタイプを関連付けることは可能ですか?

Javascript コードの例:

doStuff.prototype.isDefined = true; //is there anything like Javascript's function prototypes in Dart?
function doStuff(){
    console.log("The function doStuff was called!");
}

Dart でこれと同等のことを行うことは可能ですか (つまり、各関数のプロパティのリストを作成しますか?)

4

2 に答える 2

6

ここで対処する 2 つの点:

まず、Dart にはプロトタイプやプロトタイプの継承がなく、代わりに従来の継承が使用されます。オブジェクトにはプロトタイプではなくクラスがあり、プロトタイプ チェーンの代わりにオブジェクトにはスーパー クラスがあります。

第二に、あなたの特定のケースでは、Dart でそれを行うための慣用的な方法を理解するために何をする必要があるかをもっと見る必要があると思います。オブジェクトを使用して関数をエミュレートすることがすぐに可能になるため、オブジェクトを呼び出しても状態やその他のメソッドが関連付けられます。

詳細については、この記事を参照してください: http://www.dartlang.org/articles/emulating-functions/

その能力が上陸すると、これを行うことができます:

class DoStuff {
  bool isDefined = true;
  call() => print("The function doStuff was called!");
}
var doStuff = new DoStuff();

main() => doStuff();

追跡する必要がある関数に関するメタデータの固定セットがある場合、これは機能します。関数の各インスタンスが Dart に対して独自の状態を持つため、JavaScript とは少し異なりますisDefined。関数の複数のインスタンスを JavaScript で取得できるかどうか、または簡単に取得できるかどうかはわかりませんがisDefined、値がすべてのインスタンスで共有されるように静的にする必要がある場合があります。

于 2012-10-01T05:10:32.677 に答える
2

Dart では、実行時にクラスのインスタンスからメンバー変数を追加または削除することはできません。Dart で例を書き直すと、次のようになります。

class doStuff {
  bool isDefined;
  doStuff() {
    isDefined = true;
  }
  void stuff() {
    print('The function stuff was called!');
  }
}

main() {
  new doStuff().stuff();
}

Dart のクラスにプロパティ バッグを追加する場合は、次のように記述します。

class PropertyObject {
  Map<String, Dynamic> properties;

  PropertyObject() {
    properties = new Map<String, Dynamic>();
  }

  Dynamic operator[](String K) => properties[K];
  void operator[]=(String K, Dynamic V) => properties[K] = V;
}

main() {
  PropertyObject bag = new PropertyObject();
  bag['foo'] = 'world';
  print('Hello ${bag['foo']}');
}

「.」を使用してマップ プロパティにアクセスできないことに注意してください。オペレーター。

于 2012-10-01T03:34:31.473 に答える