2017-05-05 13 views
8

क्या मैं आयात पर डिफ़ॉल्ट निर्यात ऑब्जेक्ट को नष्ट कर सकता हूं?एक डिफ़ॉल्ट निर्यात ऑब्जेक्ट को नष्ट करना

निम्नलिखित निर्यात वाक्य रचना (export default)

const foo = ... 
function bar() { ... } 

export default { foo, bar }; 

है निम्न आयात वाक्य रचना वैध जे एस को देखते हुए?

import { foo, bar } from './export-file'; 

मैं पूछता हूं क्योंकि यह मेरे सिस्टम पर काम करता है, लेकिन मुझे बताया गया है कि यह spec के अनुसार काम नहीं करना चाहिए।

export foo; 
export bar; 

के बाद से एक से अधिक ऑब्जेक्ट निर्यात किया जा रहा है, वे मॉड्यूल प्रणाली द्वारा परोक्ष एक वस्तु में लिपटे रहे हैं:

+0

अच्छा सवाल मैं वहाँ लग रही है लेकिन वे 'निर्यात डिफ़ॉल्ट {ए, बी} 'http://exploringjs.com/es6/ch_modules.html –

+1

का भी उपयोग करते हैं जिन्होंने कहा कि यह काम नहीं करना चाहिए? लेकिन मैं उनके साथ सहमत हूं, यह काम नहीं करना चाहिए। क्या आप अपनी पर्यावरण सेटिंग्स प्रदान कर सकते हैं या कहीं डेमो प्रोजेक्ट साझा कर सकते हैं? – Bergi

+0

@ बर्गि: आपने किया :) लेकिन मुझे इस वाक्यविन्यास बाधा को spec में वर्तनी नहीं दिखाई दे रही है ... – sfletche

उत्तर

14

क्या मैं आयात पर एक डिफ़ॉल्ट निर्यात वस्तु को नष्ट कर सकता हूं?

नहीं। आप इसे एक चर में आयात करने के बाद केवल एक वस्तु को नष्ट कर सकते हैं।

ध्यान दें कि आयात/निर्यात में वाक्यविन्यास और अर्थशास्त्र हैं जो ऑब्जेक्ट अक्षर/ऑब्जेक्ट पैटर्न से बिल्कुल अलग हैं। एकमात्र आम बात यह है कि दोनों घुंघराले ब्रेसिज़ का उपयोग करते हैं, और उनके शॉर्टेंड प्रतिनिधित्व (केवल पहचानकर्ता नाम और अल्पविराम के साथ) अलग-अलग हैं।

क्या निम्न आयात वाक्यविन्यास वैध जेएस है?

import { foo, bar } from './export-file'; 

हां। यह मॉड्यूल से दो नामित निर्यात आयात करता है। यह जिसका अर्थ है "एक बाध्यकारी foo घोषित करने और इसे संदर्भ चर कि export-file से नाम foo के तहत निर्यात किया गया था, और एक बाध्यकारी bar घोषित करने और इसे संदर्भ चर के तहत निर्यात किया गया था जाने के लिए

import { foo as foo, bar as bar } from './export-file'; 

एक आशुलिपि संकेतन है export-file से bar नाम "।

निम्नलिखित निर्यात वाक्य रचना (निर्यात डिफ़ॉल्ट)

export default { foo, bar }; 

इस के साथ ऊपर आयात काम करता है को देखते हुए?

सं क्या यह होता है, एक अदृश्य चर घोषित वस्तु { foo: foo, bar: bar } के साथ आरंभ, और नाम default के तहत निर्यात करने के लिए है।
इस मॉड्यूल export-file के रूप में आयात किया जाता है, नाम default इस्तेमाल किया नहीं किया जाएगा और नाम foo और bar पाया जा नहीं होगा जो एक SyntaxError की ओर जाता है।

इसे ठीक करने के लिए आपको या तो डिफ़ॉल्ट निर्यात वस्तु आयात करने की आवश्यकता:

import { default as obj } from './export-file'; 
const {foo: foo, bar: bar} = obj; 
// or abbreviated: 
import obj from './export-file'; 
const {foo, bar} = obj; 

या फिर आप अपने आयात वाक्य रचना रखने के लिए और के बजाय नामित निर्यात का उपयोग करें:

export { foo as foo, bar as bar }; 
// or abbreviated: 
export { foo, bar }; 
// or right in the respective declarations: 
export const foo = …; 
export function bar() { ... } 
+0

मैंने अनगिनत बार पढ़ा है कि 'डिफ़ॉल्ट निर्यात पसंदीदा हैं' और सरल वाक्यविन्यास प्रदान करता है। लेकिन डिफ़ॉल्ट ऑब्जेक्ट को आयात करने और फिर सामग्री को नष्ट करने की आवश्यकता नहीं है, उस दावे को काउंटर चलाएं? – sfletche

+1

@sfletche हां, वह दावा गलत है। जब आपके पास एकाधिक चर होते हैं, तो नाम निर्यात निर्यात किया जाता है। डिफ़ॉल्ट निर्यात केवल तभी किया जाता है जब निर्यात करने के लिए केवल एक ही प्रमुख मूल्य होता है (उदा। कक्षा)। डिफ़ॉल्ट निर्यात में सरल वाक्यविन्यास होता है क्योंकि उन्हें अक्सर आवश्यकता होती है, न कि क्योंकि उन्हें आम तौर पर पसंद किया जाता है। – Bergi

+0

आह! धन्यवाद @ बर्गि! मैं इस तरह की व्याख्या की तलाश कर रहा हूं :) – sfletche

-2

आपका कोड के बराबर है। मॉड्यूल के निर्यात वास्तव में इस तरह दिखते हैं:

{ foo: {}, bar: {} } 

इस प्रकार मॉड्यूल को जेएस में निर्यात किया जाता है; एकाधिक निर्यात विवरणों के बावजूद एक वस्तु में।

तो डी-स्ट्रक्चरिंग समझ में आता है, आप अभी भी एक वस्तु को डी-स्ट्रक्चर कर रहे हैं जैसा आप सामान्य रूप से करेंगे। यह पूरी तरह से मान्य है।

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