2012-05-26 5 views
13

आप ब्राउज़र में console.log($('some selector')) करते हैं, यह रिटर्न क्या एक सरणी (पहली पंक्ति) की तरह दिखता है:

picture from latest version of chrome web console on Github project page

लेकिन लगता है कि यह एक instanceof Array नहीं है, लेकिन यह वास्तव में the jQuery object है।

जब आप console.dir($('h1')) करते हैं, तो यह दिखाता है कि यह वास्तव में jQuery ऑब्जेक्ट है।

सवाल यह है कि वे इसे वेब कंसोल में एक सरणी की तरह कैसे दिख रहे हैं? मैंने jQuery स्रोत here में देखा है, वे कुछ ऐरे और ऑब्जेक्ट विधियों का संदर्भ जोड़ते हैं, और here वे toArray (और टुकड़ा और अन्य) jQuery ऑब्जेक्ट में जोड़ते हैं। क्या वेब कंसोल किसी भी तरह इन तरीकों की जांच कर रहा है और यदि उसे एक (toArray, indexOf, slice इत्यादि) मिलता है, तो यह इसे ऐरे के रूप में प्रिंट करता है? मैं इस व्यवहार को किसी भी कस्टम ऑब्जेक्ट से प्राप्त करना चाहता हूं, जैसे Ember.ArrayProxy। वर्तमान में जब आप Ember.ArrayProxy लॉग करते हैं तो यह > Object या जो कुछ भी दिखाता है, लेकिन इसे एक सरणी के रूप में दिखाना अच्छा लगेगा।

कोई विचार?

+0

क्या यह कोड की एक छवि है? – jimw

+0

हां यह एक छवि है –

+0

संबंधित: http://stackoverflow.com/questions/6599071/array-like-objects-in-javascript। – pimvdb

उत्तर

15

आप अपने वस्तु प्रोटोटाइप का उपयोग कर, इसलिए जैसे Array वारिस बनाना:

function SomeType() { 
    this.push(16); 
} 

SomeType.prototype = []; 
SomeType.prototype.constructor = SomeType; // Make sure there are no unexpected results 

console.log(new SomeType()); // Displays in console as [16] 

और, बेशक, सभी jQuery वस्तुओं jQuery समारोह/निर्माता के उदाहरण हैं, जिससे कि कैसे jQuery यह करता है। विरासत के कारण, बोनस के रूप में, आपको Array से सभी विधियां मिलती हैं, और इसके साथ आने वाली अनुक्रमणिका भी!

+0

क्या यह काम क्रॉस ब्राउज़र करता है? –

+0

@ लांसपालार्ड: हां। – Ryan

+2

अच्छा! खैर मैंने अभी कुछ और परीक्षण किए हैं, और यदि आप ऐसा करते हैं: 'var x = {length: 0, splice: Array.prototype.splice}', फिर 'x' एक ऐरे की तरह दिखेगा। अजीब ... यह विशेष रूप से उन 2 गुणों की आवश्यकता है जो ऐसा लगता है। –

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