2011-09-13 13 views
5
function Set() {   // This is the constructor 
    this.values = {};  
    this.n = 0;   
    this.add.apply(this, arguments); // All arguments are values to add 
} 

// Add each of the arguments to the set. 
Set.prototype.add = function() { 
    /* Code to add properties to the object's values property */ 
    return this; 
}; 

में लागू() फ़ंक्शन की आवश्यकता क्यों है, यह 'सेट' क्लास बनाने के लिए "जावास्क्रिप्ट: द डिफिनिटिव गाइड" में उपयोग किए गए कोड की शुरुआत है। मैंने कन्स्ट्रक्टर में apply() फ़ंक्शन की आवश्यकता को तर्कसंगत बनाने की कोशिश की है लेकिन यह मेरे जीवन के लिए इसे समझ नहीं सकता है।कन्स्ट्रक्टर

this.add.apply(this, arguments); 

अगर add() समारोह पहले से ही एक विधि 'this' तो क्या प्रयोजन या प्रयोग के द्वारा कहा जाता है को पूरा करने कोर apply() कार्य है। किसी को पहले से जो मुझे

http://jsfiddle.net/Marlin/Ydwgv/ को यह समझाने का प्रयास करता है धन्यवाद - जावास्क्रिप्ट से पूर्ण उदाहरण: निश्चित गाइड

+0

ऐसा लगता है कि यह थोड़ा उद्देश्य प्रदान करता है। मैंने इसे कभी नहीं देखा है ... – Blender

+0

इस तथ्य पर आपके विचार क्या हैं कि वे तर्क वस्तुएं पार कर रहे हैं? – ChaosPandion

+0

आपको नहीं लगता कि यह सुनिश्चित करने के साथ कुछ भी हो सकता है कि add() प्रोटोटाइप की बजाय इंस्टेंस की संपत्ति के रूप में नहीं जोड़ा गया है? मैं समझता हूं कि इसे घोषित नहीं किया जा रहा है ...... लेकिन यह निश्चित रूप से मुझे भ्रमित कर रहा है – Marlin

उत्तर

7

"ऐड() फ़ंक्शन पहले से ही एक विधि 'इस' फिर से बुलाया है अगर क्या उद्देश्य या उपयोग कोर लागू() फ़ंक्शन को पूरा है। "

ताकि arguments एक पूरे संग्रह के रूप में पारित किया जा सकता। उपयोगी अगर Set एक अनिश्चित संख्या में तर्क स्वीकार करता है।

+0

ठीक है, मुझे देखने दो कि मुझे यह मिल गया है या नहीं। जोड़ें() अनंत तर्क स्वीकार करता है लेकिन संग्रह को स्वीकार नहीं करता है। आवेदन() का उपयोग करके आप इस प्रतिबंध को बाईपास कर सकते हैं? – Marlin

+0

@ मार्लिन काफी बोलते हुए, हां ;-) संभवतः 'add'' का शरीर 'तर्क' ऑब्जेक्ट पर पुनरावृत्त करता है और प्रत्येक तत्व के साथ कुछ करता है (जहां प्रत्येक तत्व उस पैरामीटर का प्रतिनिधित्व करता है जिसमें फ़ंक्शन को शामिल किया गया था)। –

+0

@ मार्लिन: हां, '.apply()' का उपयोग करके, 'सेट()' पर व्यक्तिगत तर्कों की संख्या को पारित किया गया था, उन्हें अलग-अलग तर्कों के रूप में '.add() 'पर भेज दिया जाएगा। – user113716

2

यह निर्माता में की जरूरत नहीं है - वास्तव में, यह कुछ भी नहीं सामान्य में एक निर्माता से कोई लेना देना नहीं है (लेकिन स्पष्ट रूप से यह इस विशिष्ट एक ;-) के लिए मायने रखती है। apply करता है यह सुनिश्चित करता है कि लक्ष्य कार्य "सही ढंग से" लागू किया गया हो।

है, apply, जब एक सरणी जैसी वस्तु * (arguments मायने रखता है), [n1, n2, ... n3] और एक समारोह f दिया, यह लक्ष्य समारोह f(n1, n2, ... n3) के रूप में कॉल करेंगे। apply भी "यह संदर्भ" लेता है जो कोड में नव निर्मित ऑब्जेक्ट को पारित करता है (ऐसा लगता है कि add को "सामान्य विधि के रूप में" कहा जाता था)। अधिक जानकारी/उदाहरणों के लिए उपरोक्त लिंक देखें।

इसका मतलब है, कि इसके बाद के संस्करण कोड के लिए,

var s = new Set(1, 2, 3) 

और

var s = new Set() 
s.add(1, 2, 3) 

बराबर हैं।

हैप्पी कोडिंग।


* 4 से पहले फ़ायरफ़ॉक्स में इसे एक ऐरे-उचित होना था।

f.apply(context, Array.prototype.slice.call(arguments, 0)) 
1

मेरा मानना ​​है कि यह क्षेत्र के लिए नहीं बुलाया जा रहा है, लेकिन तथ्य यह है कि लागू तर्क की एक सरणी लेते हैं और उन्हें क्रम में पारित करेंगे:

this.add.apply(this, [1,2,3,4]); 
.... 
function add(one, two, three, four) 
यही कारण है कि कभी कभी कोड बदसूरत मुहावरा का उपयोग करता है

एक एकल पैरामीटर नहीं है जो एक सरणी

+0

सही, मैं त्वरित प्रतिक्रिया – Marlin

1

apply फ़ंक्शन की विधि आपको आइटम की सूची के बजाय सरणी पास करके फ़ंक्शन को आमंत्रित करने की अनुमति देती है।

इसे समझने के लिए:

function add(a, b) { 
    return a+b; 
} 

var values = [1,2]; 

alert(add.apply(this, values)); 

सूचित करेंगे 3.


तो, अनिवार्य रूप से, तुम क्या कर रहे है अपने निर्माता किसी भी संख्या तर्कों की लेने के लिए अनुमति देता है, और आप करेंगे फिर उन्हें एक शॉट में add फ़ंक्शन में पास करें।

तो, आप के साथ अपने निर्माता कॉल करने के लिए थे:

var stack = new Set(1,2,3,4,5,6,7,8,9); 

उन मूल्यों के सभी add कार्य करने के लिए पारित हो जाएगा, जैसे कि आपके द्वारा लिखी गई हैं:

this.add(1,2,3,4,5,6,7,8,9); 
+0

सही की सराहना करता हूं, यही वही है जो मुझे जानना आवश्यक था। सीखा कुछ दिन पहले लागू किया गया था, सोचा था कि इसका इस्तेमाल विभिन्न वस्तुओं से विधियों को कॉल करने के लिए किया गया था – Marlin

1

का उपयोग करना .apply() वाक्यविन्यास आपको कार्यवाही के लिए तर्कों की एक सरणी पारित करने की अनुमति देता है। इस मामले में यह arguments ऑब्जेक्ट पास कर रहा है, जिसका अर्थ है कि यह add() को सेट कन्स्ट्रक्टर फ़ंक्शन में पास किए गए सभी पैरामीटर के साथ कॉल कर रहा है। तो तुम कह रही है, उदा मूल्यों की एक मनमाना संख्या के साथ नए सेट वस्तुओं बना सकते हैं

var mySet = new Set(13,42,18,19,44,11,5); 

और उन मूल्यों के सभी add() के माध्यम से पारित हो जाएगा।

+0

धन्यवाद, मेरे पिछले आवेदनों में शामिल है कि स्पष्टीकरण शामिल है लेकिन एक अलग वस्तु से विधि को कॉल करने की क्षमता पर अधिक केंद्रित है – Marlin

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