2012-10-01 88 views
2

在Dart中,函數是否可能有與之相關的原型?Dart編程語言是否與Javascript的「原型」等效?

例子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(即,爲每一個功能的屬性列表?)

回答

1

達特不允許添加或者在運行時從類的實例中移除成員變量。在重寫你的飛鏢例如它可能是這個樣子:

class doStuff { 
    bool isDefined; 
    doStuff() { 
    isDefined = true; 
    } 
    void stuff() { 
    print('The function stuff was called!'); 
    } 
} 

main() { 
    new doStuff().stuff(); 
} 

如果你想一個屬性包添加到達特一個類你可以這樣寫:

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

請注意,你不能訪問使用'。'映射屬性運營商。

+0

我很驚訝地發現從Javascript到Dart的轉換比原始的Javascript版本更加冗長。 –

+0

另一種方法是實現Function接口: – Cutch

4

兩件事情來解決這裏:

首先,飛鏢沒有原型或者原型繼承,而是使用傳統的繼承。對象有一個類,而不是一個原型,而不是原型鏈,對象有一個超類。其次,對於您的具體情況,我認爲我們必須更多地瞭解您需要做些什麼來弄清楚在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,但您可能需要使其爲靜態,以便在所有實例之間共享該值。