2012-11-27 20 views
5

हम एक कस्टम काम पर JavaScript लाइब्रेरी जहाँ हम ऐसा करने का उपयोग कर रहे:__proto__ वैकल्पिक हल 10

DOM.__proto__ = Library.prototype; 

जल्दी से आंतरिक कार्य/गुण डोम वस्तुओं इतना है कि यह कैसे के लिए इसी तरह इस्तेमाल किया जा सकता हस्तांतरण करने के लिए उदाहरण के लिए jQuery यह करता है।

एक नई परियोजना के लिए हमें इसे इंटरनेट एक्सप्लोरर के लिए लागू करने की आवश्यकता है लेकिन दुर्भाग्य से __proto__ IE द्वारा समर्थित नहीं है।

कोई विचार, इसके लिए पॉलीफिल के कामकाज? आवश्यकता केवल आईई 10 है (लेकिन आईई 9 भी अच्छा होगा)।

+0

यह एक अच्छा समाधान होने की संभावना नहीं है। आप किसी अन्य ऑब्जेक्ट के प्रोटोटाइप को प्रतिस्थापित/अपहरण/इंजेक्ट करने के बजाय IE में प्रोटोटाइप केवल * बढ़ा सकते हैं। – xiaoyi

+0

ठीक है, लेकिन इसे विस्तारित करना आईई में कैसा दिखता है? – user1768759

उत्तर

1

आपके जैसे डीओएम तत्व को सीधे विस्तारित करने के बजाय, आप इसे अपने एपीआई से लपेट सकते हैं;

// Wrapping Constructor 
function Library(element) { 
    this.element = element; 
} 

// Whatever it is your library does 
Library.prototype = { 
    // some example method 
    html: function(markup) { 
    // refer to "this.element" instead of "this" 
    this.element.innerHTML = markup; 
    } 
}; 

// example 
var wrappedElement = new Library(document.getElementById('unique')); 

// refer to the API rather than the Element directly 
wrappedElement.html('<span>Hello World</span>'); 

तुम भी लाइब्रेरी safely subclassing Array with this technique द्वारा कुछ और विस्तार कर सकते हैं।

उम्मीद है कि यह मदद करता है, धन्यवाद।

0

क्या यह विस्तार के बारे में:

$.extend(Element.constructor.prototype, Library.prototype); 

संपादित करें: कारण सार्वजनिक चिल्लाहट, मैं ध्यान दें जाएगा कि extend 2014 आप कर सकते हैं के वर्ष में जे एस प्रोग्रामिंग के संदर्भ में एक बहुत परिचित अवधारणा है ऑनलाइन यह कई उदाहरण मिलें कि यह क्या है और यह कैसे काम करता है, और आपके प्रोजेक्ट में पहले से उपयोग की जाने वाली कम से कम एक लाइब्रेरी का एक बहुत अच्छा मौका है (jQuery, लो-डैश/अंडरस्कोर, एंगुलरजेएस, एम्बर.जेएस ...)

+0

यहां तक ​​कि 'jQuery' का भी सवाल है कि यह अभी भी एक सामान्य है और 'jQuery' से संबंधित नहीं है, इसलिए आपको अभी भी उल्लेख करना चाहिए कि '$ .extend' jQuery लाइब्रेरी का हिस्सा है। क्योंकि यह प्रत्येक पाठक के लिए स्पष्ट नहीं हो सकता है। –

+1

@ t.niese जब तक कोई पिछले दस वर्षों से गुफा में नहीं रह रहा है, मुझे लगता है कि वे जानते हैं कि '$' jQuery को इंगित करता है। –

+1

@ टोरज़ाबूरो अभी भी पर्याप्त लोग हैं जो जेएस, jQuery, के बीच अंतर करने में सक्षम नहीं हैं ... और यहां SO पर पर्याप्त प्रश्न हैं जो दिखाते हैं कि लोगों को यह नहीं पता कि वे '$' होने पर jQuery का उपयोग कर रहे हैं। इसके अतिरिक्त '$' jQuery के लिए आरक्षित नहीं है। हालांकि वर्तमान में यह महापौर पुस्तकालय है, लेकिन भविष्य में पुस्तकालय होने की आवश्यकता नहीं है। तो मुझे अभी भी लगता है कि या तो 'jQuery.extend()' लिख रहा है या यह उल्लेख कर रहा है कि यह jQuery से है, यह एक अच्छी बात होगी। –

2

__proto__ को 0 बनाने के बाद असाइन करने के बजायऑब्जेक्ट, Object.create (MSDN, IE9 के बाद से समर्थित) का उपयोग करें सही प्रोटोटाइप वाला ऑब्जेक्ट बनाएं, और उसके बाद गुणों को असाइन करें।

var DOM = {}; 
DOM.__proto__ = Library.prototype;
var DOM = Object.create(Library.prototype);

आप मौजूदा (और शायद विदेशी) वस्तुओं के प्रोटोटाइप को संशोधित करना चाहते हैं तो बस इसे से बचें। वैसे भी यह एक बुरा अभ्यास है।

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