2012-10-05 9 views
23

क्या मैं जावास्क्रिप्ट में 'विंडो' ऑब्जेक्ट में कोई यादृच्छिक विशेषता जोड़ सकता हूं? जैसे कुछ बात:क्या मैं जावास्क्रिप्ट में 'विंडो' ऑब्जेक्ट में विशेषताओं को जोड़ सकता हूं?

window.my_own_attr = "my_value" 

यह किसी भी पुस्तकालयों के साथ कोई साइड इफेक्ट है? और क्या यह क्रॉस-ब्राउज़र संगत है?

उत्तर

39

क्या मैं जावास्क्रिप्ट में 'विंडो' ऑब्जेक्ट में कोई यादृच्छिक विशेषता जोड़ सकता हूं?

हां, जैसा आपने दिखाया है।

क्या इसका किसी भी पुस्तकालय के साथ कोई दुष्प्रभाव है?

नहीं, जब तक कि आप एक लाइब्रेरी का उपयोग नहीं करते हैं जो एक संपत्ति सेट करता है जिसे आप ओवरराइट करते हैं।

और क्या यह क्रॉस-ब्राउज़र संगत है?

हाँ, पूरी तरह से।


यह कहकर कि, यह अभ्यास आम तौर पर डूब जाता है। आप उस चीज़ को ओवरराइट कर सकते हैं जिसे आप नहीं चाहते हैं।

+1

पर कॉल करने की आवश्यकता है: http://stackoverflow.com/questions/864942/, मैं 'window.name' को बदलना नहीं चाहता था, इसलिए कुछ अजीब नाम का उपयोग करेगा जो खड़ा है अकेले मेरे ऐप के लिए बाहर। – akkishore

+1

ठीक है, ऐसा लगता है कि केवल 'window.name' को पुनः लोड में रखा गया है :( – akkishore

+7

+1 सभी तीन ओपी सवालों के जवाब देने के लिए एक सूचनात्मक तरीके से प्रश्न। – ddtpoison777

2

हाँ, आप कर सकते हैं, लेकिन सामान्य रूप से आपको नहीं करना चाहिए।

window ऑब्जेक्ट जेएस डिफ़ॉल्ट "वैश्विक" ऑब्जेक्ट भी है, इसलिए सभी वैश्विक चर वहां जोड़े गए हैं।

जब तक आप पहले से मौजूद किसी संपत्ति को ओवरराइट नहीं करते हैं, तब तक आप कुछ भी तोड़ने की संभावना नहीं रखते हैं, लेकिन इसे window पर वैरिएबल डंप करने के लिए खराब अभ्यास माना जाता है, या अन्यथा बहुत सारे वैश्विक चर बनाते हैं।

0

यह ठीक काम करेगा, किसी भी पुस्तकालय के साथ कोई संघर्ष नहीं होगा जब तक कि एक ही वैरिएबल नाम नहीं है, सभी ब्राउज़रों में काम करेगा, लेकिन इसकी अनुशंसा नहीं की जाती क्योंकि यह वैश्विक जेएस चर बना देगा।

+0

'विंडो' वैसे भी एक वैश्विक वस्तु है। तो ठीक है मुझे लगता है? – akkishore

+0

में आपका मामला आप 'window_' के बिना सीधे 'my_own_attr' तक पहुंच सकते हैं, जो इसे वैश्विक बनाता है और उसी नाम के साथ अन्य चर के साथ संघर्ष कर सकता है। – Dev

7

में सभी ब्राउज़र, window जावास्क्रिप्ट वैश्विक नामस्थान है। उस नामस्थान में प्रत्येक संपत्ति या विधि 'जीवन'। इसलिए यदि आप window पर कोई संपत्ति असाइन करते हैं, तो यह एक प्रभावशाली एक वैश्विक चर है।

उदाहरण:

window.myConstant = 5; 

function multiply(val){ 
    return myConstant * (val || 1); 
} 
multiply(10); //=> 50 
multiply(); //=> 5 

आप जावास्क्रिप्ट चौखटे के साथ सतर्क रहना होगा। उदाहरण के लिए, यदि आप window.JQuery घोषित करते हैं, और JQuery ढांचे का उपयोग करते हैं, तो JQuery नेमस्पेस को आपके असाइनमेंट द्वारा प्रतिस्थापित किया जाएगा, इसे बेकार प्रदान किया जाएगा।

<div id="num"></div>

alert(num); //Element

num = 3; //throws exception

var num = 3; //ok

0

आईई में अगर एक तत्व एक आईडी है, तो उस नोड एक संपत्ति के रूप में खिड़की वस्तु पर पहुँचा जा सकता है मैं दोबारा नहीं कहूंगा कि दूसरों ने क्या कहा है: टी की हैकनेस उसका अभ्यास लेकिन वेनिला एचटीएमएल/जेएस (या jQuery) कोड के साथ मिश्रित कोणीय जैसे कठोर ढांचे का उपयोग करते समय यह अविश्वसनीय रूप से उपयोगी हो सकता है। जो भी हैकी और फंसे हुए हैं, लेकिन कभी-कभी अच्छे कारण होते हैं, जैसे कि आपके पास बहुत से पूर्व-मौजूदा जेएस कोड हैं जो ढांचे में एकीकृत करने के लिए चुनौतीपूर्ण होंगे।

मुझे और अधिक दिलचस्प सवाल यह है कि वैश्विक window ऑब्जेक्ट में गुण जोड़ने की क्षमता का उपयोग कैसे करें। एक पैटर्न है जिसका उपयोग मैं एक कोणीय प्रदाता (सेवा) के तरीकों को कोड में प्रकट करना चाहता हूं, जो अन्यथा सेवा को इंजेक्ट करने में असमर्थ होगा, संभवतः क्योंकि यह कोणीय डी ढांचे के बाहर चलता है। जिस तरह से मैं इसे करता हूं, निम्नानुसार है:

  1. अपनी शीर्ष स्तर मॉड्यूल में प्रदाता के रूप में अपनी सेवा को परिभाषित करें।
  2. निर्माता या app.component.js की onInit में (या जो भी अपने शीर्ष स्तर घटक है कि प्रदाता का आयात करता है), सामान्य रूप से प्रदाता इंजेक्षन, किसी भी एक समय प्रारंभ इसकी आवश्यकता है कि प्रदर्शन, और फिर फोन window['MyServiceName'] = this

मान लीजिए कि आपने प्रदाता को सिंगलटन पैटर्न का पालन करने के लिए डिज़ाइन किया है, तो आपके प्रदाता के तरीकों को अब कहीं से भी सुरक्षित रूप से बुलाया जा सकता है। एक गैर-कोणीय स्क्रिप्ट को बस window['MyServiceName'].methodName()