2015-02-22 7 views
5

MDN page forObject.assign() में उदाहरण पॉलीफिल पहले गुणों को फिर से शुरू करने से पहले Object() में सभी स्रोतों और लक्ष्य पैरामीटर को लपेटता है। (यानी Object(target), Object(source1), Object(source2) ...)।'ऑब्जेक्ट (लक्ष्य)' में 'ऑब्जेक्ट (लक्ष्य)' का उद्देश्य क्या है 'ऑब्जेक्ट (पासवर्ड)' पॉलीफिल

पाठ में यह भी उल्लेख किया गया है कि लक्ष्य को वापस करने से पहले अतिरिक्त गुण सीधे लक्ष्य में जोड़े गए हैं। हालांकि, Object() में लक्ष्य को लपेटने से ऑब्जेक्ट में परिणाम होता है जो गुणों को बढ़ाने के अलावा अलग होता है। (यानी Object(target).newProp !== target.newProp)।

दिए गए सभी उदाहरणों में Object.assign() पर पैरामीटर के रूप में ऑब्जेक्ट्स हैं। गैर-ऑब्जेक्ट स्रोत या लक्ष्य पैरामीटर के लिए उपयोग-केस इसलिए स्पष्ट नहीं है।

ए)Object() में पैरामीटर को लपेटने का उद्देश्य क्या है? (मैं इस धारणा के तहत हूं कि Object.keys(x)Object.keys(Object(x)) जैसा ही है)।

बी) गैर-ऑब्जेक्ट्स के साथ Object.assign() का उपयोग करने के लिए संभावित उपयोग के मामले क्या हैं, है ना? (के लिए की तरह उदाहरण के कुछ: Object.assign(1, 'b', [3], true, function(){}))

+2

'ऑब्जेक्ट (लक्ष्य) 'किसी ऑब्जेक्ट में लक्ष्य को रोकता है। उदाहरण के लिए: 'ऑब्जेक्ट ("1234")' इसे '[ऑब्जेक्ट स्ट्रिंग] {0: "1", 1: "2", 2: "3", 3: "4", लंबाई: 4} ' – Mouser

+5

पर रखता है आमतौर पर पॉलीफिल के संयोजन के साथ विनिर्देश को पढ़ने के लिए सबसे अच्छा है, क्योंकि वे अक्सर व्यवहार को दोहराने की कोशिश करते हैं। आप [* एड से देख सकते हैं। 6 मसौदा *] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign), कि प्रत्येक तर्क * ToObject * को पास किया जाता है। चूंकि देशी स्क्रिप्ट आंतरिक तरीकों तक नहीं पहुंच पाती है, इसलिए 'ऑब्जेक्ट (लक्ष्य)' और 'ऑब्जेक्ट (स्रोत)' को कॉल करना एक अनुमान है (हालांकि ठीक वही नहीं है, खासकर * शून्य * और * अपरिभाषित * के लिए)। – RobG

+0

@ मूसर। मैं समझता हूं कि ऑब्जेक्ट() क्या करता है। जो मुझे समझ में नहीं आता है वह है कि आप कभी ऑब्जेक्ट.साइन ([], 'ए', 3, फ़ंक्शन() {}) – Hurelu

उत्तर

2

चलो इसे तोड़ने के नीचे:

टेस्ट अगर वस्तु मौजूद है, अगर यह नहीं कर सकता:

if (!Object.assign) { 

Object.defineProperty के माध्यम से विधि बनाएं और इसे Object

में जोड़ें

यहां वास्तविक कार्य सेट हो जाता है। किसी को लक्ष्य और एक स्रोत न्यूनतम आपूर्ति करने की आवश्यकता है।

value: function(target, firstSource) { 
     'use strict'; 

लक्ष्य निर्धारित नहीं है, तो एक त्रुटि फेंक देते हैं।

 if (target === undefined || target === null) { 
     throw new TypeError('Cannot convert first argument to object'); 
     } 

लक्ष्य कास्ट प्रारूप वस्तु है। (उदाहरण के लिए स्ट्रिंग 1234[object String]{0: "1", 1: "2", 2: "3", 3: "4", length: 4} करने के लिए।

 var to = Object(target); 

अब समारोह के तर्कों वस्तु। 1 से प्रारंभ करें, के बाद से 0 लक्ष्य है का उपयोग करते हुए सभी स्रोतों के माध्यम से लूप।

 for (var i = 1; i < arguments.length; i++) { 
     var nextSource = arguments[i]; //store the argument in a variable. 
     if (nextSource === undefined || nextSource === null) { 
      continue; //if the source is undefined continue. 
     } 

फिर हमें स्रोत ऑब्जेक्ट से समेकित गुणों (केवल उजागर नहीं) की आवश्यकता है,का उपयोग 01 के साथ संयोजन में करें।चाबियाँ पर

 var keysArray = Object.keys(Object(nextSource)); 

दोहराएं:

 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { 
      var nextKey = keysArray[nextIndex]; //select the key from the index. 

getOwnPropertyDescriptor हमें एक वस्तु के रूप में संपत्ति के बारे में जानकारी देता है।

  var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 

तो गुण अपरिभाषित नहीं है और गणनीय है तो to करने के लिए एक संपत्ति के रूप में इस संपत्ति निर्धारित किया है।

  if (desc !== undefined && desc.enumerable) { 
      to[nextKey] = nextSource[nextKey]; 
      } 
     } 
     } 
     return to; 
    } 
    }); 
} 

अंत में नए जोड़े (क्लोन) गुणों के साथ to लौट आते हैं।

+0

अच्छा लेकिन कारण यह है कि 'var to = ऑब्जेक्ट (लक्ष्य);' किया जाता है ऐसा नहीं है कि "कोड गुणों पर गणना कर सकता है", लेकिन यदि लक्ष्य कोई ऑब्जेक्ट नहीं था (उदाहरण के लिए '1') कोई नहीं गुणों को असाइन नहीं करते हैं। उस दावे का समर्थन करने के लिए लक्ष्य के गुणों पर कोई लूप नहीं है। –

+0

सच है, यह कभी उन्हें गिनती नहीं करता है। यह केवल एक वस्तु में परिवर्तित होता है। – Mouser

+0

क्षमा करें मुझे अभी भी यह नहीं मिला है। पॉलीफिल में थोड़ा जो मुझे समझ में नहीं आता है (इसलिए सवाल) चरण "ऑब्जेक्ट प्रारूप में लक्ष्य कास्ट करें" चरण है। मुझे ऑब्जेक्ट.कीज (ऑब्जेक्ट ')' ऑब्जेक्ट ('एबीसीडी') 'के रूप में' ऑब्जेक्ट.कीज ('abcd') 'के साथ एक ही परिणाम मिलता है। इसलिए मुझे लगता है कि रैपिंग अन्य उपयोगों के लिए है जिसे मैं अभी तक नहीं सोच सकता । – Hurelu

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