2011-09-21 13 views
10

का उपयोग करने का लाभ this question से अलग है। नीचे दिया गया कोड JavaScript: The Definitive Guide से है। वह मूल रूप से एक उत्तराधिकारी विधि को परिभाषित कर रहा है जो ऑब्जेक्ट को सुरक्षित करता है। अगर यह अस्तित्व में है, तो अन्यथा रचनाकारों का उपयोग करके सादे पुराने जावास्क्रिप्ट विरासत और चारों ओर प्रोटोटाइप को स्वैप करना।ऑब्जेक्ट.क्रेट

मेरा प्रश्न है, क्योंकि ऑब्जेक्ट.क्रेट पर मौजूद नहीं है, बहुत सारे सामान्य ब्राउज़र आईई, इसका उपयोग करने का भी प्रयास करने का क्या मतलब है? यह निश्चित रूप से कोड को अव्यवस्थित करता है, और पिछले प्रश्न पर टिप्पणीकर्ताओं में से एक ने बताया कि Object.create isn't too fast

तो इस ईसीएमए 5 फ़ंक्शन का कभी-कभी उपयोग करने के लिए अतिरिक्त कोड जोड़ने का प्रयास करने में क्या फायदा है जो ऐसा करने के "पुराने" तरीके से धीमा हो सकता है या नहीं?

function inherit(p) { 
    if (Object.create) // If Object.create() is defined... 
     return Object.create(p); // then just use it. 

    function f() {}; // Define a dummy constructor function. 
    f.prototype = p; // Set its prototype property to p. 
    return new f(); // Use f() to create an "heir" of p. 
} 

उत्तर

9

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

अपने प्रश्न का उत्तर में, कारणों नहीं गति से संबंधित हैं, लेकिन क्योंकि डिज़ाइन पैटर्न Object.create की पुराना तरीका करने के लिए इष्ट है (कि और अन्य उत्तर में उल्लिखित कारणों से)। वे ईएस 5 संपत्ति विशेषताओं (जो अधिक स्केलेबल ऑब्जेक्ट्स और इस प्रकार अधिक स्केलेबल ऐप्स के लिए बनाते हैं) के उचित उपयोग की अनुमति देते हैं, और विरासत पदानुक्रमों में सहायता कर सकते हैं।

यह आगे इंजीनियरिंग है। अगर हमने "अच्छी तरह से इसे हर जगह लागू नहीं किया है, तो चलिए अपने पैरों को गीला नहीं करते हैं", चीजें बहुत धीरे-धीरे बढ़ती हैं। इसके विपरीत, प्रारंभिक और महत्वाकांक्षी गोद लेने से उद्योग आगे बढ़ने में मदद करता है, व्यापार निर्णय निर्माताओं को नई प्रौद्योगिकियों का समर्थन करने में मदद करता है, डेवलपर्स को बेहतर बनाने और नए विचारों और सहायक ढांचे को सही करने में मदद करता है। मैं शुरुआती (लेकिन सावधानी बरतने वाला और अभी भी पिछड़ा-संगत) गोद लेने के लिए एक वकील हूं, क्योंकि अनुभव से पता चलता है कि पर्याप्त लोगों के लिए प्रौद्योगिकी का समर्थन करने के लिए इंतजार करना आपको बहुत लंबा इंतजार कर सकता है। मई आईई 6 उन लोगों के लिए सबक हो सकता है जो अन्यथा सोचते हैं।

+0

यह वास्तव में एक उपयोगी उत्तर है; मैं देख सकता हूं कि क्यों निर्माण बेहतर होगा, क्योंकि यह आपको बनाए गए ऑब्जेक्ट में गुणों पर बहुत अधिक नियंत्रण देता है। मैं देख सकता हूं कि आप 'var bob = object.create (userB, {"id": {value: 12, संख्यात्मक: झूठा' और इतने पर क्यों कहना चाहते हैं, लेकिन यह कोड IE9 और नीचे में हिंसक रूप से क्रैश नहीं होगा ? इस तरह के कोड (अद्भुत) स्थितियों तक सीमित नहीं होंगे जहां आप अपने उपयोगकर्ता का उपयोग कर रहे ब्राउज़र को नियंत्रित कर सकते हैं? –

+0

दूसरे शब्दों में, IE8 में न केवल मुझे पुराने जेएस का उपयोग करके मेरी नई विरासत विधि प्राप्त करने जा रही है चारों ओर प्रोटोटाइप को स्वैप करने की विधि, लेकिन मुझे उस ऑब्जेक्ट को बदलना होगा जो कि "बच्चे" ऑब्जेक्ट के रूप में कार्य करने के लिए पास किया गया है जो उपयोगकर्ता बी से प्राप्त होता है। '{" id ": {value: 12, संख्यात्मक: false के बजाय 'मुझे '{" id "की आवश्यकता नहीं होगी: 12," नाम ":" बॉब "और इसी तरह? –

+0

@AdamRackis, यह सच है, कोड जैसा पिछड़ा संगत नहीं है, लेकिन मुझे यकीन है कि वहां हैं ऐसी परियोजनाएं जो इन चीजों को आज़माकर व्यवस्थित करती हैं। यदि नहीं, तो यह एक अच्छा विचार है। उन परिवर्तनों को स्वचालित करना मुश्किल नहीं होगा। – davin

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

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