2012-11-04 32 views
5

के लिए C++ में stackbased ऑब्जेक्ट्स की तरह कुछ जावास्क्रिप्ट में एक निर्माण की तलाश है जो C++ में stackbased या स्थानीय ऑब्जेक्ट में विनाशक की तरह काम करता है, उदा।जावास्क्रिप्ट

#include <stdio.h> 
class M { 
public: 
    int cnt; 
    M()  {cnt=0;} 
    void inc() {cnt++;} 
    ~M()  {printf ("Count is %d\n", cnt);} 
}; 
... 
{M m; 
... 
m.inc(); 
... 
m.inc(); 
} // here the destructor of m will printf "Count is 2"); 

तो यह मैं एक निर्माण जो एक कार्रवाई जब इसके दायरे समाप्त हो रहा है करता है (जब यह "दायरे से बाहर चला जाता है") रहा हूँ मतलब है। यह इस तरह से मजबूत होना चाहिए कि इसे दायरे के अंत में विशेष कार्रवाई की आवश्यकता नहीं है, जैसे सी ++ में उस विनाशक (म्यूटेक्स-आवंटन और रिहाई को लपेटने के लिए उपयोग किया जाता है)।

चीयर्स, mg

उत्तर

1

दायरे में कोड तुल्यकालिक होने की गारंटी है, तो आप एक समारोह है कि नाशक बाद में कॉल बना सकते हैं। हालांकि यह रूप में लचीला नहीं हो सकता है और वाक्य रचना को C में के रूप में के रूप में साफ नहीं किया जा सकता ++:

enterScope(new M, function(m) { 
    m.inc(); 
    m.inc(); 
}); 

यह लॉग इन किया जाएगा:

var M = function() { 
    console.log("created"); 
    this.c = 0; 
}; 

M.prototype.inc = function() { 
    console.log("inc"); 
    this.c++; 
}; 

M.prototype.destruct = function() { 
    console.log("destructed", this.c); 
}; 


var enterScope = function(item, func) { 
    func(item); 
    item.destruct(); 
}; 

आप इसे इस रूप में इस्तेमाल कर सकते हैं

created 
inc 
inc 
destructed 2 
+2

हम्म। जटिल, लेकिन काम करता है। चूंकि "var enterscope" एम के लिए विशिष्ट है, तो इसे तब बदला जा सकता है: एम.scoped = function (func) { var m = new m; func (m); m.destruct(); }; और उसके बाद इसका उपयोग होगा: एम.scoped (फ़ंक्शन (एम) { m.inc(); m.inc(); }); – MGrant

+0

क्षमा करें, लिखा होगा: var enterscope-definition को एम के लिए विशिष्ट बनाया जा सकता है ... – MGrant

+1

'item.destruct()' को 'अंत में' ब्लॉक में लपेटा जाना चाहिए: 'कोशिश {func (item); } अंत में {item.destruct(); } ' – user

1

अफसोस की बात है कि आप जो खोज रहे हैं उसे पाने में सक्षम नहीं होंगे क्योंकि भाषा डिज़ाइन ईसीएमएस्क्रिप्ट इंजन (यानी जावास्क्रिप्ट दुभाषिया) के कार्यान्वयन को आपके लिए आवश्यकतानुसार करने के लिए मजबूर नहीं करता है।

कचरा-कलेक्टर होगा में लात (वास्तव में यह एक "might" के अधिक है) जब वहाँ वस्तु क्षेत्र से बाहर जा रहा करने के लिए कोई और अधिक संदर्भ हैं, लेकिन वहाँ आप में से किसी मानकीकृत तरीका नहीं है (के रूप में डेवलपर) इसका लाभ उठाने के लिए।

सी में dtor के लिए इसी तरह की सुविधा प्रदान करने के लिए (जैसे एक समारोह में अपने वस्तु का उपयोग लपेटकर वस्तु ही है और एक "उपयोग" -callback समारोह करना) हैक्स ++, लेकिन कोई "अतिरिक्त लेने के बिना कर रहे हैं कार्रवाई "।