[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 में: फ़ंक्शन {} घोषणा:

/*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;
}

चूंकि Object.prototype JQuery को तोड़ता है, मैं 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 के साथ संघर्ष नहीं करता