你可以在飞镖中的功能添加属性?我试过这个:你可以在Dart的函数中添加属性吗?
void main(){
fn(){
//DoSomething
};
fn.id = 1; //Exception NoSuchMethod
}
只有得到一个NoSuchMethod异常抛出。有没有什么办法可以在运行时像javascript那样为函数或任何类型的对象添加属性?
(另外它为什么说不这样的方法例外,当我分配给一个属性?)
你可以在飞镖中的功能添加属性?我试过这个:你可以在Dart的函数中添加属性吗?
void main(){
fn(){
//DoSomething
};
fn.id = 1; //Exception NoSuchMethod
}
只有得到一个NoSuchMethod异常抛出。有没有什么办法可以在运行时像javascript那样为函数或任何类型的对象添加属性?
(另外它为什么说不这样的方法例外,当我分配给一个属性?)
你不能在Function添加属性。但是,您可以定义一个可以像函数一样调用的Object
(请参阅3210)。这里有一个例子:
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
你实际上是在fn
叫implicite二传手id=
。那就是你得到这个错误的原因。
您不能添加或删除对象的成员。从概念上讲,一个对象是一个小型结构,其中有一个指向其类描述的指针和一些用于存储其状态的内存。类描述定义了分配点结构的布局。如果类描述不包含字段id
(就像在你的例子中)那么根本没有办法添加它。你既不能改变类的描述,也不能改变实际的实例(所以它对于额外的字段有更多的内存)。这可能很烦人(特别是对于用于动态修改其对象的Java脚本),但它为程序员提供了一定的保证,并使其更易于优化。对象使用较少的内存,并且优化编译器可以做出假设,否则将不成立。
有,然而,一个方法来从侧面expandos
添加属性,简单地说没有。
虽然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的东西。虽然,有些时候你需要它。
谢谢,我刚刚写了一个'IdentifiableFn'类。 – 0xor1 2013-05-08 21:12:06