తెలుగు

జావాస్క్రిప్ట్ సింబల్స్‌ను అన్వేషించండి: వాటి ఉద్దేశ్యం, సృష్టి, ప్రత్యేక ప్రాపర్టీ కీలు, మెటాడేటా నిల్వ, మరియు నేమింగ్ వైరుధ్యాలను నివారించడం. ఆచరణాత్మక ఉదాహరణలతో సహా.

జావాస్క్రిప్ట్ సింబల్స్: ప్రత్యేకమైన ప్రాపర్టీ కీలు మరియు మెటాడేటా

జావాస్క్రిప్ట్ సింబల్స్, ECMAScript 2015 (ES6) లో పరిచయం చేయబడ్డాయి, ఇవి ప్రత్యేకమైన మరియు మార్పులేని ప్రాపర్టీ కీలను సృష్టించడానికి ఒక యంత్రాంగాన్ని అందిస్తాయి. స్ట్రింగ్‌లు లేదా సంఖ్యల వలె కాకుండా, సింబల్స్ మీ మొత్తం జావాస్క్రిప్ట్ అప్లికేషన్‌లో ప్రత్యేకంగా ఉంటాయని హామీ ఇవ్వబడింది. ఇవి నేమింగ్ వైరుధ్యాలను నివారించడానికి, ఇప్పటికే ఉన్న ప్రాపర్టీలతో జోక్యం చేసుకోకుండా ఆబ్జెక్ట్‌లకు మెటాడేటాను జోడించడానికి, మరియు ఆబ్జెక్ట్ ప్రవర్తనను అనుకూలీకరించడానికి ఒక మార్గాన్ని అందిస్తాయి. ఈ వ్యాసం జావాస్క్రిప్ట్ సింబల్స్ యొక్క సృష్టి, అనువర్తనాలు మరియు ఉత్తమ పద్ధతులను వివరిస్తూ ఒక సమగ్ర అవలోకనాన్ని అందిస్తుంది.

జావాస్క్రిప్ట్ సింబల్స్ అంటే ఏమిటి?

జావాస్క్రిప్ట్‌లో సింబల్ ఒక ప్రిమిటివ్ డేటా టైప్, ఇది సంఖ్యలు, స్ట్రింగ్‌లు, బూలియన్‌లు, null మరియు undefined వంటిది. అయితే, ఇతర ప్రిమిటివ్ రకాల వలె కాకుండా, సింబల్స్ ప్రత్యేకమైనవి. మీరు ప్రతిసారి ఒక సింబల్‌ను సృష్టించినప్పుడు, మీకు పూర్తిగా కొత్త, ప్రత్యేకమైన విలువ లభిస్తుంది. ఈ ప్రత్యేకత సింబల్స్‌ను వీటికి ఆదర్శంగా చేస్తుంది:

సింబల్స్‌ను సృష్టించడం

మీరు Symbol() కన్‌స్ట్రక్టర్‌ను ఉపయోగించి సింబల్‌ను సృష్టిస్తారు. మీరు new Symbol() ఉపయోగించలేరని గమనించడం ముఖ్యం; సింబల్స్ ఆబ్జెక్ట్‌లు కాదు, ప్రిమిటివ్ విలువలు.

సాధారణ సింబల్ సృష్టి

ఒక సింబల్‌ను సృష్టించడానికి సులభమైన మార్గం:

const mySymbol = Symbol();
console.log(typeof mySymbol); // అవుట్‌పుట్: symbol

Symbol() కు ప్రతి కాల్ ఒక కొత్త, ప్రత్యేకమైన విలువను ఉత్పత్తి చేస్తుంది:

const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // అవుట్‌పుట్: false

సింబల్ వివరణలు

ఒక సింబల్‌ను సృష్టించేటప్పుడు మీరు ఐచ్ఛిక స్ట్రింగ్ వివరణను అందించవచ్చు. ఈ వివరణ డీబగ్గింగ్ మరియు లాగింగ్ కోసం ఉపయోగపడుతుంది, కానీ ఇది సింబల్ యొక్క ప్రత్యేకతను ప్రభావితం చేయదు.

const mySymbol = Symbol("myDescription");
console.log(mySymbol.toString()); // అవుట్‌పుట్: Symbol(myDescription)

వివరణ కేవలం సమాచార ప్రయోజనాల కోసం మాత్రమే; ఒకే వివరణ ఉన్న రెండు సింబల్స్ ఇప్పటికీ ప్రత్యేకమైనవి:

const symbolA = Symbol("same description");
const symbolB = Symbol("same description");
console.log(symbolA === symbolB); // అవుట్‌పుట్: false

ప్రాపర్టీ కీలుగా సింబల్స్‌ను ఉపయోగించడం

సింబల్స్ ప్రాపర్టీ కీలుగా చాలా ఉపయోగకరంగా ఉంటాయి ఎందుకంటే అవి ప్రత్యేకతను హామీ ఇస్తాయి, ఆబ్జెక్ట్‌లకు ప్రాపర్టీలను జోడించేటప్పుడు నేమింగ్ వైరుధ్యాలను నివారిస్తాయి.

సింబల్ ప్రాపర్టీలను జోడించడం

మీరు స్ట్రింగ్‌లు లేదా సంఖ్యల వలె సింబల్స్‌ను ప్రాపర్టీ కీలుగా ఉపయోగించవచ్చు:

const mySymbol = Symbol("myKey");
const myObject = {};

myObject[mySymbol] = "Hello, Symbol!";

console.log(myObject[mySymbol]); // అవుట్‌పుట్: Hello, Symbol!

నేమింగ్ వైరుధ్యాలను నివారించడం

మీరు ఆబ్జెక్ట్‌లకు ప్రాపర్టీలను జోడించే మూడవ-పక్ష లైబ్రరీతో పనిచేస్తున్నారని ఊహించుకోండి. మీరు ఇప్పటికే ఉన్న వాటిని ఓవర్‌రైట్ చేసే ప్రమాదం లేకుండా మీ స్వంత ప్రాపర్టీలను జోడించాలనుకోవచ్చు. సింబల్స్ దీన్ని చేయడానికి ఒక సురక్షితమైన మార్గాన్ని అందిస్తాయి:

// మూడవ-పక్ష లైబ్రరీ (అనుకరణ)
const libraryObject = {
  name: "Library Object",
  version: "1.0"
};

// మీ కోడ్
const mySecretKey = Symbol("mySecret");
libraryObject[mySecretKey] = "Top Secret Information";

console.log(libraryObject.name); // అవుట్‌పుట్: Library Object
console.log(libraryObject[mySecretKey]); // అవుట్‌పుట్: Top Secret Information

ఈ ఉదాహరణలో, mySecretKey మీ ప్రాపర్టీ libraryObject లోని ఏవైనా ఇప్పటికే ఉన్న ప్రాపర్టీలతో వైరుధ్యం చెందదని నిర్ధారిస్తుంది.

సింబల్ ప్రాపర్టీలను ఎన్యూమరేట్ చేయడం

సింబల్ ప్రాపర్టీల యొక్క ఒక ముఖ్యమైన లక్షణం ఏమిటంటే, అవి for...in లూప్‌లు మరియు Object.keys() వంటి стандарт ఎన్యూమరేషన్ పద్ధతుల నుండి దాచిపెట్టబడతాయి. ఇది ఆబ్జెక్ట్‌ల సమగ్రతను రక్షించడానికి మరియు సింబల్ ప్రాపర్టీల యొక్క ప్రమాదవశాత్తు యాక్సెస్ లేదా మార్పును నివారించడానికి సహాయపడుతుంది.

const mySymbol = Symbol("myKey");
const myObject = {
  name: "My Object",
  [mySymbol]: "Symbol Value"
};

console.log(Object.keys(myObject)); // అవుట్‌పుట్: ["name"]

for (let key in myObject) {
  console.log(key); // అవుట్‌పుట్: name
}

సింబల్ ప్రాపర్టీలను యాక్సెస్ చేయడానికి, మీరు Object.getOwnPropertySymbols() ను ఉపయోగించాలి, ఇది ఒక ఆబ్జెక్ట్‌పై ఉన్న అన్ని సింబల్ ప్రాపర్టీల యొక్క శ్రేణిని తిరిగి ఇస్తుంది:

const mySymbol = Symbol("myKey");
const myObject = {
  name: "My Object",
  [mySymbol]: "Symbol Value"
};

const symbolKeys = Object.getOwnPropertySymbols(myObject);
console.log(symbolKeys); // అవుట్‌పుట్: [Symbol(myKey)]
console.log(myObject[symbolKeys[0]]); // అవుట్‌పుట్: Symbol Value

వెల్-నోన్ సింబల్స్

జావాస్క్రిప్ట్ అంతర్నిర్మిత సింబల్స్ యొక్క సెట్‌ను అందిస్తుంది, వీటిని వెల్-నోన్ సింబల్స్ అంటారు, ఇవి నిర్దిష్ట ప్రవర్తనలు లేదా కార్యాచరణలను సూచిస్తాయి. ఈ సింబల్స్ Symbol కన్‌స్ట్రక్టర్ యొక్క ప్రాపర్టీలు (ఉదా., Symbol.iterator, Symbol.toStringTag). ఇవి వివిధ సందర్భాలలో ఆబ్జెక్ట్‌లు ఎలా ప్రవర్తిస్తాయో అనుకూలీకరించడానికి మిమ్మల్ని అనుమతిస్తాయి.

Symbol.iterator

Symbol.iterator అనేది ఒక ఆబ్జెక్ట్ కోసం డిఫాల్ట్ ఇటరేటర్‌ను నిర్వచించే ఒక సింబల్. ఒక ఆబ్జెక్ట్‌కు Symbol.iterator కీతో ఒక పద్ధతి ఉన్నప్పుడు, అది ఇటరేబుల్ అవుతుంది, అంటే మీరు దాన్ని for...of లూప్‌లు మరియు స్ప్రెడ్ ఆపరేటర్ (...) తో ఉపయోగించవచ్చు.

ఉదాహరణ: కస్టమ్ ఇటరేబుల్ ఆబ్జెక్ట్‌ను సృష్టించడం

const myCollection = {
  items: [1, 2, 3, 4, 5],
  [Symbol.iterator]: function* () {
    for (let item of this.items) {
      yield item;
    }
  }
};

for (let item of myCollection) {
  console.log(item); // అవుట్‌పుట్: 1, 2, 3, 4, 5
}

console.log([...myCollection]); // అవుట్‌పుట్: [1, 2, 3, 4, 5]

ఈ ఉదాహరణలో, myCollection అనేది Symbol.iterator ను ఉపయోగించి ఇటరేటర్ ప్రోటోకాల్‌ను అమలు చేసే ఒక ఆబ్జెక్ట్. జనరేటర్ ఫంక్షన్ items శ్రేణిలోని ప్రతి అంశాన్ని అందిస్తుంది, myCollection ను ఇటరేబుల్ చేస్తుంది.

Symbol.toStringTag

Symbol.toStringTag అనేది Object.prototype.toString() ను పిలిచినప్పుడు ఒక ఆబ్జెక్ట్ యొక్క స్ట్రింగ్ రిప్రజెంటేషన్‌ను అనుకూలీకరించడానికి మిమ్మల్ని అనుమతించే ఒక సింబల్.

ఉదాహరణ: toString() రిప్రజెంటేషన్‌ను అనుకూలీకరించడం

class MyClass {
  get [Symbol.toStringTag]() {
    return 'MyClassInstance';
  }
}

const instance = new MyClass();
console.log(Object.prototype.toString.call(instance)); // అవుట్‌పుట్: [object MyClassInstance]

Symbol.toStringTag లేకుండా, అవుట్‌పుట్ [object Object] గా ఉంటుంది. ఈ సింబల్ మీ ఆబ్జెక్ట్‌లకు మరింత వివరణాత్మక స్ట్రింగ్ రిప్రజెంటేషన్‌ను ఇవ్వడానికి ఒక మార్గాన్ని అందిస్తుంది.

Symbol.hasInstance

Symbol.hasInstance అనేది instanceof ఆపరేటర్ యొక్క ప్రవర్తనను అనుకూలీకరించడానికి మిమ్మల్ని అనుమతించే ఒక సింబల్. సాధారణంగా, instanceof ఒక ఆబ్జెక్ట్ యొక్క ప్రోటోటైప్ చైన్‌లో కన్‌స్ట్రక్టర్ యొక్క prototype ప్రాపర్టీ ఉందో లేదో తనిఖీ చేస్తుంది. Symbol.hasInstance ఈ ప్రవర్తనను ఓవర్‌రైడ్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది.

ఉదాహరణ: instanceof చెక్‌ను అనుకూలీకరించడం

class MyClass {
  static [Symbol.hasInstance](instance) {
    return Array.isArray(instance);
  }
}

console.log([] instanceof MyClass); // అవుట్‌పుట్: true
console.log({} instanceof MyClass); // అవుట్‌పుట్: false

ఈ ఉదాహరణలో, Symbol.hasInstance పద్ధతి ఇన్‌స్టాన్స్ ఒక శ్రేణి కాదా అని తనిఖీ చేస్తుంది. ఇది వాస్తవ ప్రోటోటైప్ చైన్‌తో సంబంధం లేకుండా, MyClass ను శ్రేణుల కోసం ఒక చెక్‌గా పనిచేసేలా చేస్తుంది.

ఇతర వెల్-నోన్ సింబల్స్

జావాస్క్రిప్ట్ అనేక ఇతర వెల్-నోన్ సింబల్స్‌ను నిర్వచిస్తుంది, వీటిలో ఇవి ఉన్నాయి:

గ్లోబల్ సింబల్ రిజిస్ట్రీ

కొన్నిసార్లు, మీరు మీ అప్లికేషన్ యొక్క వివిధ భాగాలలో లేదా వివిధ అప్లికేషన్‌ల మధ్య కూడా సింబల్స్‌ను పంచుకోవలసి ఉంటుంది. గ్లోబల్ సింబల్ రిజిస్ట్రీ ఒక కీ ద్వారా సింబల్స్‌ను నమోదు చేయడానికి మరియు తిరిగి పొందడానికి ఒక యంత్రాంగాన్ని అందిస్తుంది.

Symbol.for(key)

Symbol.for(key) పద్ధతి గ్లోబల్ రిజిస్ట్రీలో ఇవ్వబడిన కీతో ఒక సింబల్ ఉందో లేదో తనిఖీ చేస్తుంది. అది ఉంటే, అది ఆ సింబల్‌ను తిరిగి ఇస్తుంది. అది లేకపోతే, అది కీతో ఒక కొత్త సింబల్‌ను సృష్టించి రిజిస్ట్రీలో నమోదు చేస్తుంది.

const globalSymbol1 = Symbol.for("myGlobalSymbol");
const globalSymbol2 = Symbol.for("myGlobalSymbol");

console.log(globalSymbol1 === globalSymbol2); // అవుట్‌పుట్: true
console.log(Symbol.keyFor(globalSymbol1)); // అవుట్‌పుట్: myGlobalSymbol

Symbol.keyFor(symbol)

Symbol.keyFor(symbol) పద్ధతి గ్లోబల్ రిజిస్ట్రీలో ఒక సింబల్‌తో అనుబంధించబడిన కీని తిరిగి ఇస్తుంది. సింబల్ రిజిస్ట్రీలో లేకపోతే, అది undefined ను తిరిగి ఇస్తుంది.

const mySymbol = Symbol("localSymbol");
console.log(Symbol.keyFor(mySymbol)); // అవుట్‌పుట్: undefined

const globalSymbol = Symbol.for("myGlobalSymbol");
console.log(Symbol.keyFor(globalSymbol)); // అవుట్‌పుట్: myGlobalSymbol

ముఖ్యమైనది: Symbol() తో సృష్టించబడిన సింబల్స్ గ్లోబల్ రిజిస్ట్రీలో స్వయంచాలకంగా నమోదు చేయబడవు. Symbol.for() తో సృష్టించబడిన (లేదా తిరిగి పొందబడిన) సింబల్స్ మాత్రమే రిజిస్ట్రీలో భాగం.

ఆచరణాత్మక ఉదాహరణలు మరియు వినియోగ సందర్భాలు

నిజ జీవిత దృశ్యాలలో సింబల్స్‌ను ఎలా ఉపయోగించవచ్చో ప్రదర్శించే కొన్ని ఆచరణాత్మక ఉదాహరణలు ఇక్కడ ఉన్నాయి:

1. ప్లగిన్ సిస్టమ్‌లను సృష్టించడం

వివిధ మాడ్యూల్స్ ఒకరికొకరు ప్రాపర్టీలతో వైరుధ్యం చెందకుండా కోర్ ఆబ్జెక్ట్ యొక్క కార్యాచరణను విస్తరించగల ప్లగిన్ సిస్టమ్‌లను సృష్టించడానికి సింబల్స్‌ను ఉపయోగించవచ్చు.

// కోర్ ఆబ్జెక్ట్
const coreObject = {
  name: "Core Object",
  version: "1.0"
};

// ప్లగిన్ 1
const plugin1Key = Symbol("plugin1");
coreObject[plugin1Key] = {
  description: "Plugin 1 adds extra functionality",
  activate: function() {
    console.log("Plugin 1 activated");
  }
};

// ప్లగిన్ 2
const plugin2Key = Symbol("plugin2");
coreObject[plugin2Key] = {
  author: "Another Developer",
  init: function() {
    console.log("Plugin 2 initialized");
  }
};

// ప్లగిన్‌లను యాక్సెస్ చేయడం
console.log(coreObject[plugin1Key].description); // అవుట్‌పుట్: Plugin 1 adds extra functionality
coreObject[plugin2Key].init(); // అవుట్‌పుట్: Plugin 2 initialized

ఈ ఉదాహరణలో, ప్రతి ప్లగిన్ ఒక ప్రత్యేక సింబల్ కీని ఉపయోగిస్తుంది, ఇది సంభావ్య నేమింగ్ వైరుధ్యాలను నివారిస్తుంది మరియు ప్లగిన్‌లు శాంతియుతంగా కలిసి ఉండగలవని నిర్ధారిస్తుంది.

2. DOM ఎలిమెంట్స్‌కు మెటాడేటాను జోడించడం

DOM ఎలిమెంట్స్ యొక్క ఇప్పటికే ఉన్న ఆట్రిబ్యూట్‌లు లేదా ప్రాపర్టీలతో జోక్యం చేసుకోకుండా వాటికి మెటాడేటాను జోడించడానికి సింబల్స్‌ను ఉపయోగించవచ్చు.

const element = document.createElement("div");

const dataKey = Symbol("elementData");
element[dataKey] = {
  type: "widget",
  config: {},
  timestamp: Date.now()
};

// మెటాడేటాను యాక్సెస్ చేయడం
console.log(element[dataKey].type); // అవుట్‌పుట్: widget

ఈ విధానం మెటాడేటాను ఎలిమెంట్ యొక్క стандарт ఆట్రిబ్యూట్‌ల నుండి వేరుగా ఉంచుతుంది, ఇది నిర్వహణ సామర్థ్యాన్ని మెరుగుపరుస్తుంది మరియు CSS లేదా ఇతర జావాస్క్రిప్ట్ కోడ్‌తో సంభావ్య వైరుధ్యాలను నివారిస్తుంది.

3. ప్రైవేట్ ప్రాపర్టీలను అమలు చేయడం

జావాస్క్రిప్ట్‌లో నిజమైన ప్రైవేట్ ప్రాపర్టీలు లేనప్పటికీ, గోప్యతను అనుకరించడానికి సింబల్స్‌ను ఉపయోగించవచ్చు. ఒక ప్రాపర్టీ కీగా ఒక సింబల్‌ను ఉపయోగించడం ద్వారా, మీరు బయటి కోడ్ ప్రాపర్టీని యాక్సెస్ చేయడం కష్టతరం చేయవచ్చు (కానీ అసాధ్యం కాదు).

class MyClass {
  #privateSymbol = Symbol("privateData"); // గమనిక: ఈ '#' సింటాక్స్ ES2020లో పరిచయం చేయబడిన ఒక *నిజమైన* ప్రైవేట్ ఫీల్డ్, ఇది ఉదాహరణకు భిన్నమైనది

  constructor(data) {
    this[this.#privateSymbol] = data;
  }

  getData() {
    return this[this.#privateSymbol];
  }
}

const myInstance = new MyClass("Sensitive Information");
console.log(myInstance.getData()); // అవుట్‌పుట్: Sensitive Information

// "ప్రైవేట్" ప్రాపర్టీని యాక్సెస్ చేయడం (కష్టం, కానీ సాధ్యం)
const symbolKeys = Object.getOwnPropertySymbols(myInstance);
console.log(myInstance[symbolKeys[0]]); // అవుట్‌పుట్: Sensitive Information

Object.getOwnPropertySymbols() ఇప్పటికీ సింబల్‌ను బహిర్గతం చేయగలిగినప్పటికీ, ఇది బయటి కోడ్ "ప్రైవేట్" ప్రాపర్టీని ప్రమాదవశాత్తు యాక్సెస్ చేయడం లేదా మార్చడం తక్కువ సంభావ్యతను కలిగిస్తుంది. గమనిక: నిజమైన ప్రైవేట్ ఫీల్డ్‌లు (# ప్రిఫిక్స్‌ను ఉపయోగించి) ఇప్పుడు ఆధునిక జావాస్క్రిప్ట్‌లో అందుబాటులో ఉన్నాయి మరియు బలమైన గోప్యతా హామీలను అందిస్తాయి.

సింబల్స్‌ను ఉపయోగించడానికి ఉత్తమ పద్ధతులు

సింబల్స్‌తో పనిచేసేటప్పుడు గుర్తుంచుకోవలసిన కొన్ని ఉత్తమ పద్ధతులు ఇక్కడ ఉన్నాయి:

ముగింపు

జావాస్క్రిప్ట్ సింబల్స్ ప్రత్యేకమైన ప్రాపర్టీ కీలను సృష్టించడానికి, ఆబ్జెక్ట్‌లకు మెటాడేటాను జోడించడానికి మరియు ఆబ్జెక్ట్ ప్రవర్తనను అనుకూలీకరించడానికి ఒక శక్తివంతమైన యంత్రాంగాన్ని అందిస్తాయి. సింబల్స్ ఎలా పనిచేస్తాయో అర్థం చేసుకోవడం మరియు ఉత్తమ పద్ధతులను అనుసరించడం ద్వారా, మీరు మరింత దృఢమైన, నిర్వహించదగిన మరియు వైరుధ్య-రహిత జావాస్క్రిప్ట్ కోడ్‌ను వ్రాయవచ్చు. మీరు ప్లగిన్ సిస్టమ్‌లను నిర్మిస్తున్నా, DOM ఎలిమెంట్స్‌కు మెటాడేటాను జోడిస్తున్నా, లేదా ప్రైవేట్ ప్రాపర్టీలను అనుకరిస్తున్నా, సింబల్స్ మీ జావాస్క్రిప్ట్ అభివృద్ధి వర్క్‌ఫ్లోను మెరుగుపరచడానికి ఒక విలువైన సాధనాన్ని అందిస్తాయి.