2013-03-12 16 views
5

मुझे लगता है कि जैसे एक वस्तु है आयातस्क्रिप्ट ("object.js") के साथ। अब मैं "var a = new A()" के साथ HTML-पृष्ठ में ए का एक उदाहरण बना देता हूं और इसे "वर्कमेज()" के साथ वेब वर्कर में पोस्ट करता हूं।वेब करने के लिए एक जावास्क्रिप्ट-वस्तु पासिंग कार्यकर्ता

मजाकिया बात यह है कि कार्यकर्ता में अभी भी इसकी संपत्ति के साथ संपत्ति "आईडी" है लेकिन प्रोटोटाइप फ़ंक्शन खो गया है। मुझे लगता है कि कारण यह हो सकता है कि प्रोटोटाइप फ़ंक्शन HTML-पृष्ठ संदर्भ में "बाध्य" हैं, न कि वेब कार्यकर्ता संदर्भ के लिए।

event.data.a.__proto__ = A.prototype; 

यह काम कर रहा है और मैं कलाकारों के कुछ प्रकार के रूप में देखते हैं ...

अब मेरे सवाल है, तो यह है कि केवल है:

तो क्या मैं कार्यकर्ता में कर रहा हूँ वह यह है कि और एक वैध तरीका या यदि वेब कार्यकर्ता को प्रोटोटाइप कार्यों के साथ ऑब्जेक्ट पोस्ट करने का बेहतर तरीका है। ऑब्जेक्ट परिभाषा दोनों संदर्भों में उपलब्ध है ...

उत्तर

1

वेबवर्कर्स के लिए विनिर्देश कुछ भी करने की अनुमति नहीं देता है लेकिन तारों को पारित किया जा सकता है।

Here इस बारे में एक सवाल है।

तो आपको ऑब्जेक्ट डेटा को (उदाहरण के लिए) जेसन के साथ क्रमबद्ध करना चाहिए और उसके बाद इसे दूसरी तरफ deserialize करना चाहिए, और इस प्रकार वेबवर्कर के अंदर, उसी डेटा के साथ ऑब्जेक्ट का एक नया उदाहरण बनाना चाहिए।

ऑब्जेक्ट को फिर से बाहर करने के लिए एक ही विधि का उपयोग किया जा सकता है - लेकिन उनमें से दोनों को पता होना चाहिए कि A प्रकार की वस्तु को कैसे बनाना, क्रमबद्ध करना और deserialize करना है।

+1

मुझे पूरा यकीन है कि ऑब्जेक्ट को तब तक पास करना संभव है जब तक इसमें इसमें कार्य नहीं होता है। कम से कम यह मेरे लिए सभी प्रमुख ब्राउज़रों में काम कर रहा है ... – user2160787

+0

@ user2160787 हाँ यह है, लेकिन केवल इसलिए कि जावास्क्रिप्ट स्वचालित वस्तुओं को स्वचालित रूप से क्रमबद्ध और deserialize करेगा (जैसे सरणी)। – fredrik

+0

ठीक है धन्यवाद, तो मुझे लगता है कि मैं प्रोटोटाइप कार्यों को अस्वीकार करता हूं :) – user2160787

1

structure clone algorithm जो वेब वर्कर को भेजने से पहले डेटा को क्रमबद्ध करने के लिए उपयोग किया जाता है, प्रोटोटाइप श्रृंखला नहीं चलाता है (विवरण के लिए, § 2.7.5 Safe passing of structured data देखें)। यह बताता है कि व्युत्पन्न कार्य संरक्षित क्यों नहीं हैं।

आपके द्वारा किए गए ऑब्जेक्ट को मैन्युअल रूप से बहाल करने के अलावा, आप एक नई ऑब्जेक्ट भी बना सकते हैं, जिसमें प्रोटोटाइप फ़ंक्शन हैं, और प्राप्त ऑब्जेक्ट से गुणों की प्रतिलिपि बनाने के लिए Object.assign का उपयोग करें।

ध्यान दें कि दोनों कामकाज मानते हैं कि प्रोटोटाइप ऑब्जेक्ट और उनके कार्य वेब कार्यकर्ता को ज्ञात हैं। सामान्य रूप से, कार्यों को संरक्षित करते समय मनमाने ढंग से वस्तुओं को स्थानांतरित करने का कोई स्वचालित तरीका नहीं है (कार्यों के साथ वस्तुओं को भेजने के बारे में मेरे answer से this related question देखें)।

संबंधित मुद्दे