Dart编程语言是否具有与Javascript的“原型”相同的功能?

时间:2012-10-01 02:51:14

标签: dart

在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中执行相同的操作(即,为每个函数创建属性列表?)

2 个答案:

答案 0 :(得分:4)

这里要解决两件事:

首先,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自己的状态。我不确定是否可能或很容易获得该函数的多个实例是JavasScript,但您可能需要使isDefined为静态,以便在所有实例之间共享该值。

答案 1 :(得分:1)

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']}');
}

请注意,您无法使用“。”访问地图属性操作