2009-09-08 9 views
15

MDC पर मिला था लेकिन कैसे अगर मैं जिस तरह से मैं जावास्क्रिप्ट में OOP समझ मेंइस जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक स्निपेट में निजी चर जोड़ने के लिए कैसे?

var dataset = { 
    tables:{ 
     customers:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     }, 
     orders:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     } 
    }, 
    relations:{ 
     0:{ 
      parent:'customers', 
      child:'orders', 
      keyparent:'custid', 
      keychild:'orderid', 
      onetomany:true 
     } 
    } 
} 

के लिए एक निजी चर जोड़ना चाहते थे था, मैं dataset.tables.customers.cols के लिए उपयोग [0 होगा ] अगर ऐसी कोई वस्तु मौजूद है।
लेकिन अगर मैं ग्राहकों में एक निजी चर रखना चाहता था, तो यह कैसा दिखता है?
var index = 0; जोड़ना एक रनटाइम त्रुटि में परिणाम।

उत्तर

25

आपके पास शामिल फ़ंक्शन के बिना "निजी" चर नहीं हो सकते हैं। जावास्क्रिप्ट में एक नया दायरा पेश करने का एकमात्र तरीका कार्य हैं।

लेकिन कभी नहीं डर है, तो आप कर सकते हैं कार्यों सही जगह में अपनी वस्तु

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
     } 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

साथ कार्यक्षमता की इस तरह हासिल करने के लिए जोड़ने लेकिन यह हमें ज्यादा लाभ नहीं है। यह अभी भी ज्यादातर शाब्दिक वस्तुओं का एक गुच्छा है। इस प्रकार के "निजी" चर के शून्य अर्थ हैं क्योंकि कोई विधि नहीं है - कुछ भी नहीं जो वास्तव में एक फ़ंक्शन (एक बंद) जोड़कर बनाए गए दायरे में चर का उपयोग करेगा या अन्यथा उपयोग करेगा।

लेकिन अगर हमारे पास कोई तरीका था, तो वास्तव में यह उपयोगी हो सकता है।

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ], 
     getPrivateVar: function() 
     { 
      return privateVar; 
     } 
     }; 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

alert(dataset.tables.customers.getPrivateVar()); 
9

जावास्क्रिप्ट में अधिक कठोर भाषाओं में पहुंच नियंत्रण नियंत्रणों की कमी है। आप closures का उपयोग कर ऑब्जेक्ट्स डेटा के लिए निजी पहुंच का अनुकरण कर सकते हैं, लेकिन आपका उदाहरण एक ऑब्जेक्ट शाब्दिक है - एक साधारण डेटा संरचना - एक निर्मित ऑब्जेक्ट की बजाय।

यह निर्भर करता है कि आप वस्तु के साथ क्या करना चाहते हैं - 'निजी' सदस्यों के लिए सामान्य तकनीक का अर्थ है कि वे केवल सदस्य कार्यों द्वारा ही पहुंच योग्य हैं, और यह आवश्यक है कि आप ऑब्जेक्ट बनाने के लिए एक कन्स्ट्रक्टर का उपयोग करें। शाब्दिक वाक्यविन्यास का उपयोग सार्वजनिक संरचनाओं और कार्यों के साथ डेटा संरचनाओं या हल्के वजन वस्तुओं के लिए किया जाता है।

निजी बंद करने के पैटर्न का उपयोग करने में समस्या यह है कि एक शाब्दिक क्षेत्र के क्षेत्र सार्वजनिक क्षेत्र में हैं, लेकिन बंद होने से दी गई गोपनीयता इसलिए है क्योंकि परिवर्तनीय को फ़ंक्शन में परिभाषित किया जाता है, इसलिए स्थानीय रूप से स्कॉप्ड किया जाता है। आप या तो एक ऐसा फ़ंक्शन बना सकते हैं जो शाब्दिक क्लोन करता है और निजी फ़ील्ड जोड़ता है, या एक सार्वजनिक फ़ील्ड जोड़ता है जिसमें निजी डेटा होता है। आप सदस्यों के रूप में बंद भी जोड़ सकते हैं, इसलिए निजी फ़ील्ड बनाएं जो निजी ऑब्जेक्ट की बजाय निजी विधि हैं।

dataset = { 
    secretCounter: ( 
     function() { 
     var c = 0; 
     return function() { return ++c; } 
    })(),  
    ... 

तो dataset.secretCounter() एक varable c जो केवल कि समारोह के लिए निजी है है।

+0

ओह! मुझे लगता है कि तुमने मुझे ट्रैक पर वापस लाया। डेटा संरचनाएं निजी सदस्यों को नहीं रख सकती हैं क्योंकि वे केवल डेटा घोषित करते हैं (सबकुछ सार्वजनिक है!) लेकिन यदि मैं इसे एक स्थिर वर्ग/सिंगलटन (var obj = function() {}();) में फिर से लिखता हूं, तो मैं सक्षम हूं को। क्या वो सही है? धन्यवाद। :) –

4

जावास्क्रिप्ट में निजी चर एक बंद के अंदर विभिन्न कीवर्ड का उपयोग करके किया जाता है। केवल निजीकृत तरीके और गुण इसे एक्सेस कर सकते हैं। यहां ऐसा करने का तरीका है:

function dataset() 
{ 
var private_stuff = 10; // private 
this.foo = new function() { alert(private_stuff); } // priviliged 
return { 
    tables:{ 
     customers:{ 
       cols:[ ], 
       rows:[ ] 
     }, 
     orders:{ 
       cols:[ ], 
       rows:[ ] 
     } 
    }, 
    relations:{ 
     0:{ 
       parent:'customers', 
       child:'orders', 
       keyparent:'custid', 
       keychild:'orderid', 
       onetomany:true 
     } 
    } 
}; // public 
} 

var d = new dataset; 
alert(d.foo()); 
+2

var d = नया डेटासेट(); या यह है: var d = डेटासेट(); – pkario

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