你能在Dart中添加属性吗?

时间:2013-05-08 20:54:31

标签: javascript dynamic methods properties dart

您可以在dart中添加属性吗?我试过这个:

void main(){

    fn(){
        //DoSomething
    };

    fn.id = 1; //Exception NoSuchMethod

}

仅抛出NoSuchMethod异常。有没有办法在运行时为函数或任何类型的对象添加属性,如javascript?

(为什么我在分配属性时没有说这种方法异常?)

3 个答案:

答案 0 :(得分:3)

您无法在Function上添加媒体资源。但是,您可以定义可以像函数一样调用的Object(请参阅Emulating Functions in 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。这就是你得到这个错误的原因。

答案 1 :(得分:1)

您无法添加或删除对象的成员。从概念上讲,对象是一个小结构,带有指向其类描述的指针和一些用于存储其状态的内存。类描述定义了分配点处结构的布局。如果类描述不包含字段id(如您的示例中所示),则根本无法添加它。您既不能更改类描述也不能更改实际实例(因此它为额外字段提供了更多内存)。这可能很烦人(特别是对于用于动态修改其对象的JavaScripters),但它为程序员提供了一定的保证并使其更易于优化。对象使用较少的内存,优化编译器可以做出原本不能保留的假设。

但是,有一种方法可以使用expandos

从侧面添加属性

答案 2 :(得分:0)

简单地说不 然而,Expando可以模仿它。

var e = new Expando();
e[f] = 'hi';
print(e[f]);//prints hi

宣传我的套餐可能不合适,但由于其相关:

import 'package:mistletoe/mistletoe.dart';
Dynamism d = new Dynamism(expert:true);
void main(){
    var o = new Object();
    d.on(o).greetings = ()=>print('hello world');
    d.on(o).greetings();//prints hello world
    o = null;
    //With o garbage collected, d is empty now. 
}

git:https://github.com/TastyCatFood/mistletoe

还有像这样的包:https://pub.dartlang.org/packages/dynamic_object它似乎覆盖noSuchMethod来创建一个允许伪动态添加属性的自定义类。如果扩展类Function并覆盖noSuchMethod,我确定你可以创建一个允许你添加属性的函数对象。

一般来说,你应该避免使你的代码过于动态。 Dart分析器和你的IDE不支持这些hacky事情。虽然,有时你需要它。