[javascript] जावास्क्रिप्ट में प्रोटोटाइप ऑब्जेक्ट jQuery टूटता है?


Answers

यदि यह केवल गड़बड़ करने का मामला है ... लूप में, क्या आप ऑब्जेक्ट.डेफिनप्रॉपर्टी का उपयोग अपने एफएन को बिना अंकुरित किए जोड़ने के लिए कर सकते हैं?

इसलिए:

Object.defineProperty(Object.prototype, "foo", { 
    value: function() {
        // do stuff
    },
    enumerable : false
});

लगता है मेरे लिए काम करता है। क्या यह अभी भी खराब रूप माना जाएगा?

Question

मैंने अपने पृष्ठ पर एक साधारण .js फ़ाइल जोड़ दी है जिसमें Object और Array प्रोटोटाइप में जोड़े गए कुछ सुंदर सामान्य-कार्य प्रकार हैं।

परीक्षण और त्रुटि के माध्यम से, मैंने यह पता लगाया है कि Object.prototype में कोई भी फ़ंक्शन Object.prototype , इससे कोई फर्क नहीं पड़ता कि इसका नाम क्या है या यह jQuery में जावास्क्रिप्ट त्रुटियों का कारण बनता है:

अपराधी?

Object.prototype.foo = function() {
    /*do nothing and break jQuery*/
};

त्रुटि में मुझे jquery-1.3.2.js की लाइन 1056 मिल रही है, attr: function {} घोषणा:

/*Object doesn't support this property or method*/
name = name.replace(/-([a-z])/ig, function(all, letter) {
            return letter.toUpperCase();
        });

स्पष्ट रूप से जी.रेप्लेस अपरिभाषित है।

हालांकि यह स्पष्ट है कि कुछ ऐसा है जो मैं अपने सिर को प्रोटोटाइप के साथ लपेट नहीं रहा हूं, मैं यह समझने में दुखी हूं कि यह क्या है।

स्पष्ट होने के लिए, मैं एक कामकाज की तलाश नहीं कर रहा हूं, मैंने इसे संभाला है ... जो मैं खोज रहा हूं वह इसका उत्तर क्यों है?Object.prototype फ़ंक्शन जोड़ने से कोड का यह बिट क्यों टूट जाता है?




मैंने इस समस्या के चारों ओर अपने सिर को टक्कर लगी क्योंकि मैं अपनी सभी वस्तुओं में "असली" ऑब्जेक्ट ओरिएंटेशन को लागू करना चाहता था, जैसे:

interface Object
{
    GetType: () => string;
    ToString: () => string;
    GetHashcode: () => number;
    Equals: (obj: any) => boolean;
}

चूंकि ऑब्जेक्ट.प्रोटोटाइप JQuery को तोड़ता है, इसलिए मैंने defineProperty का उपयोग करने के लिए उपरोक्त समाधान के लिए डिफ़ॉल्ट किया लेकिन यह कोई तर्क नहीं लेता है।

अच्छी खबर यह है कि आप DefineProperty में हैक कर सकते हैं और वास्तव में पैरामीटर स्वीकार करते हैं। मेरा कार्यान्वयन यहां है:

Object.defineProperty(Object.prototype, "Equals",
    {
        value: function (obj: any)
        {
            return obj == null && this == null
                    ? true
                    : obj != null && this == null
                        ? false
                        : obj == null && this != null
                            ? false
                            : this.GetHashcode() == obj.GetHashcode();
        },
        enumerable: false
    });

यह काम करता है और JQuery के साथ संघर्ष नहीं करता है।




Related