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

这里要解决两件事:

首先,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();

如果您有一组关于您需要跟踪的函数的固定元数据,那么这很有效。它与 JavaScript 略有不同,因为 Dart 函数的每个实例都有自己的状态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 回答