2011-03-26 14 views
6

मैं जावास्क्रिप्ट में गेटर्स और सेटर्स का शोध कर रहा हूं और वे jQuery के $ .extend और अंडरस्कोर _ _extend जैसे ऑब्जेक्ट्स को विस्तारित करने के लिए फैल फ़ंक्शन के साथ कितनी अच्छी तरह से जाते हैं।जावास्क्रिप्ट गेटर्स/सेटर्स और ऑब्जेक्ट्स विस्तारित

var test = { 
    get size() { return this._size; }, 
    set size(val) { this._size = val; }, 
} 

test.size = "LARGE"; 
console.log(test.size); 

//$.extend(test, { get size() { return "MEDIUM"; } }); 
_.extend(test, { get size() { return "MEDIUM"; } }); 

console.log(test.size); 
test.size = "SMALL"; 
console.log(test.size); 

Chrome और Firefox में मैं मिल:

LARGE 
MEDIUM 
SMALL 

कोई मुझे बता सकते हैं कि वहाँ क्या हो रहा है कोड सेटअप इस प्रकार है? मूल सेटटर को कॉल करने के बाद, मूल गेटर भी बहाल किया जाता है?

+1

मुझे लगता है कि लगता है गेटटर मूल सेटटर और गेटटर दोनों को प्रतिस्थापित करता है, और अंत में यह संपत्ति 'आकार' को "SMALL" पर सेट करता है। 'Console.log (this._size) करें;' अंत में और देखें कि आपको क्या मिलता है .. – JCOC611

+0

@ JCOC611 - मुझे ऐसा नहीं लगता है। स्पष्टीकरण के लिए मेरा जवाब देखें। –

उत्तर

5

अंडरस्कोर के extend इस तरह दिखता है:

_.extend = function(obj) { 
    each(slice.call(arguments, 1), function(source) { 
    for (var prop in source) obj[prop] = source[prop]; 
    }); 
    return obj; 
}; 

यह स्रोत ऑब्जेक्ट के गुणों iterates, उन्हें लक्ष्य वस्तु के लिए कहते हैं, और उसके बाद लक्ष्य वस्तु देता है। जब वस्तु को यह प्रतियां size संपत्ति आप का विस्तार कर रहे हैं, यह मूल रूप से इस करता है:

obj['size'] = source['size'] 

है यही कारण है, यह नई वस्तु के गेटर का उपयोग करता है, लेकिन प्रतियां केवल मूल्य कि गेटर से लौट आए। यह गेटर खुद को स्थानांतरित नहीं करता है।

आगे इस प्रदर्शन करने के लिए, निम्न प्रयास करें:

var test = { 
    get size() { return this._size; }, 
    set size(val) { this._size = val; }, 
} 

for (var p in test) { 
    console.log(p) 
} 

कौन सा केवल आउटपुट: (। यह ही टिककर खेल या setters पुनरावृति नहीं करता है)

size 

+2

मैं विस्तारित विधि लिखने के बारे में कैसे जाउंगा जो गेटर्स/सेटर्स पर प्रतिलिपि करता है? – semicolon

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