你可以在飛鏢中的功能添加屬性?我試過這個:你可以在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