2013-03-25 4 views
7
Object.prototype.doSomething = function(p) { 
    this.innerHTML = "<em>bar</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

document.getElementById("foo").doSomething("Hello World"); 

<div id="foo"><strong>foo</strong></div>क्या जावास्क्रिप्ट में ऑब्जेक्ट पर प्रोटोटाइप फ़ंक्शन को परिभाषित करना ठीक है?

कोड ऊपर ठीक काम करता है।

लेकिन मुझे याद है कि मैंने इसे कहीं देखा: Do not mess with native Object. अच्छा, ऐसा कुछ।

तो ऑब्जेक्ट पर प्रोटोटाइप फ़ंक्शन को परिभाषित करना ठीक है? क्या कोई कारण है कि मुझे यह नहीं करना चाहिए?

+0

एक पुस्तकालय दूसरों के लिए इस लेने वाली हो जाएगा के रूप में नहीं परिभाषित, कॉल एक विधि के लिए है? या अपने स्वयं के आवेदन कोड के लिए? –

+0

मैं एक छोटी पुस्तकालय लिख रहा हूं कि अन्य भी इसका उपयोग कर रहे हैं। जैसा कि नीचे दिए गए उत्तरों के रूप में, मुझे लगता है कि मुझे यह नहीं करना चाहिए, इससे कोई फर्क नहीं पड़ता कि कोड किसके लिए लिखा गया है। – user1643156

उत्तर

5

केवल सुरक्षित तरीका Object.prototype में जोड़ने के लिए ES5 विधि Object.defineProperty उपयोग करने के लिए एक गैर गणनीय संपत्ति बनाने के लिए है:

Object.defineProperty(Object.prototype, 'doSomething', { 
    value: function(p) { ... }, 
    enumerable: false, // actually the default 
}); 

यह सुनिश्चित करता है अगर आप for (key in object) है कि नई संपत्ति प्रकट नहीं होता है ।

ध्यान दें कि इस फ़ंक्शन को विश्वसनीय रूप से shimmed नहीं किया जा सकता है क्योंकि ईसीएमएस्क्रिप्ट/जावास्क्रिप्ट के पिछले संस्करणों में गैर-संख्यात्मक गुण मौजूद नहीं थे।

किसी भी स्थिति में, यदि आपकी विधि केवल HTML पृष्ठ तत्वों पर लागू होती है, तो आप इसे Element.prototype पर Object.prototype के बजाय बेहतर जोड़ देंगे, हालांकि यदि आप ऐसा करते हैं तो पुराने (आईई) ब्राउज़र शिकायत कर सकते हैं।

+0

['hasOwnProperty'] नहीं है (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) फिर भी सबसे अच्छा अभ्यास है? –

+0

@RoatinMarth no, IMHO 'hasOwnProperty' _old_ सर्वोत्तम अभ्यास है। एक ईएस 5 ब्राउज़र में यह अनावश्यक होना चाहिए। कोई भी कोड जो 'ऑब्जेक्ट.प्रोटोटाइप' के साथ अशुद्ध रूप से गड़बड़ कर दिया जाना चाहिए। यहां तक ​​कि jQuery भी 'हैऑनप्रॉपर्टी' परीक्षण को छोड़ देता है और स्पष्ट रूप से बताता है कि अगर आप उस कोड का उपयोग करते हैं तो इसका असफल हो जाएगा। – Alnitak

+0

'गैर-संख्यात्मक गुण जावास्क्रिप्ट के पिछले संस्करणों में मौजूद नहीं हैं।' जिसका संस्करण 'पिछले'' से आपका संस्करण है? – user1643156

1

आम तौर पर एक अच्छा विचार नहीं है। यह फ़ंक्शन अब आपके ऐप में सब कुछ पर उपलब्ध है जो ऑब्जेक्ट प्रोटोटाइप (जो बहुत कुछ है) का उपयोग करता है और ऑब्जेक्ट प्रोटो का वर्णन करने वाले कार्यों में दिखाई देगा।

function MyObject { 
    ... 
} 

MyObject.prototype.doSomething = function() { 
    ... 
} 

var myObj = new MyObject(); 
1

आप वस्तु प्रोटोटाइप के लिए सामान जोड़ने, तो आप गणनीय गुण के बाद से आप के रूप में पदभार दोहराया जाता है को शामिल किया है for p in obj का उपयोग कर अच्छा वस्तु यात्रा कार्यक्षमता, खो देते हैं:

एक बेहतर विकल्प एक अलग प्रोटोटाइप परिभाषित करने के लिए है अच्छी तरह से सभी वस्तुओं पर

उदाहरण के लिए:

Object.prototype.doSomething = function(p) { 
    this.innerHTML = "<em>bar</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

for (p in {foo:"bar"}){ 
    console.log(p); 
} 

//foo 
//doSomething 

अनपेक्षित रूप से, आप भी doSomething लॉग इन मिल जाएगा। इसे ठीक करने के लिए, आपको अपनी ऑब्जेक्ट पर पुनरावृत्ति करते समय hasOwnproperty जांचना होगा, लेकिन यहां जोखिम यह है कि आप अन्य कोड तोड़ सकते हैं जो किसी सादे ऑब्जेक्ट को शाब्दिक में निर्दिष्ट गुणों के अलावा अन्य गुणों की अपेक्षा नहीं करता है।

+0

_enumerable_ गुणों के बाद से आपने जोड़ा है ... – Alnitak

+0

@Alnitak अपडेट किया गया, धन्यवाद। –

0

एक अन्य विकल्प एक वस्तु प्रोटोटाइप method-

function doSomething(p) { 
    this.innerHTML = "<em>"+p+"</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

//

doSomething.call(document.getElementById("foo"),"Hello World"); 
संबंधित मुद्दे