क्लास के फ़ील्ड और तरीके

फ़ील्ड

क्लास फ़ील्ड का एलान सीधे क्लास के मुख्य भाग में किया जाता है. इन्हें this वैल्यू की प्रॉपर्टी के तौर पर साफ़ तौर पर नहीं जोड़ा जाता. हालांकि, नतीजा ऐसा ही होता है: उस क्लास के इंस्टेंस पर तय की गई प्रॉपर्टी.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

वैल्यू के साथ फ़ील्ड को शुरू किया जा सकता है. आम तौर पर, यह एक डिफ़ॉल्ट वैल्यू होती है. क्लास का लॉजिक ओवरराइट हो सकता है:

class MyClass {
    myResult = false;
    set setValue( myValue ) {
        this.myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> Object { myResult: false }

myClassInstance.setValue = true;

myClassInstance;\
> Object { myResult: true }

क्लास फ़ील्ड, this का इस्तेमाल करके क्लास से जुड़ी प्रॉपर्टी के जैसे ही हैं. इसका मतलब यह है कि उन्हें किसी भी दूसरी प्रॉपर्टी की तरह क्लास के बाहर से ऐक्सेस और बदला जा सकता है.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

फ़ील्ड, क्लास की कुछ ज़्यादा बेहतर सुविधाओं का आधार मुहैया कराते हैं.

निजी फ़ील्ड और तरीके

निजी फ़ील्ड और तरीकों को क्लास के बाहर ऐक्सेस नहीं किया जा सकता. निजी प्रॉपर्टी, किसी क्लास के इंस्टेंस से जुड़ी होती है. इसका मतलब है कि हर इंस्टेंस में, क्लास में बताए गए निजी फ़ील्ड और तरीकों का अपना सेट होता है.

किसी प्रॉपर्टी को निजी बनाने के लिए, यह एलान करते समय, आइडेंटिफ़ायर की शुरुआत में # जोड़ें:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object { … }
        constructor: class MyClass {}
        <prototype>: Object { … }

शामिल क्लास के मुख्य हिस्से में, निजी फ़ील्ड का एलान करना ज़रूरी है. बाद में, this की प्रॉपर्टी के तौर पर इसकी वैल्यू को बदला जा सकता है. हालांकि, this का इस्तेमाल करके फ़ील्ड नहीं बनाया जा सकता.

निजी फ़ील्ड को स्क्रिप्ट में कहीं से ऐक्सेस नहीं किया जा सकता. यह डेटा प्रॉपर्टी को, गैटर और सेटर के दिए गए तरीकों के अलावा, उनमें शामिल वैल्यू के साथ इंटरैक्ट करने से रोकता है. साथ ही, यह सिर्फ़ क्लास में इस्तेमाल करने के लिए डिज़ाइन किए गए तरीकों को सीधे तौर पर ऐक्सेस करने से रोकता है.

class MyClass {
    #myResult = false;
    set setValue( myValue ) {
        this.#myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myResult: false }

myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult

myClassInstance.setValue = true;

myClassInstance;\
> MyClass { #myResult: true }

हालांकि, ध्यान रखें कि ब्राउज़र के डेवलपर कंसोल में आम तौर पर बहुत अनुमति होती है, लेकिन डीबग करने के मकसद से निजी फ़ील्ड को ऐक्सेस करने की अनुमति नहीं होती है:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> true

myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod

निजी फ़ील्ड, क्लास के उन मुख्य हिस्से पर बहुत कम होते हैं जिसमें वे शामिल होती हैं. इसका मतलब है कि चाइल्ड क्लास भी पैरंट क्लास से जुड़े निजी फ़ील्ड को ऐक्सेस नहीं कर सकतीं:

class MyClass {
    #myPrivateField = true;
}
class ChildClass extends MyClass {
    childMethod() {
        console.log( this.#myPrivateField );
    }
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

स्टैटिक फ़ील्ड और तरीके

स्टैटिक फ़ील्ड और तरीके, उस क्लास के ही सदस्य होते हैं, न कि उस क्लास के इंस्टेंस के सदस्य. इस वजह से, स्टैटिक फ़ील्ड डेटा के लिए एक सेंट्रल पॉइंट देते हैं, जो किसी क्लास के हर इंस्टेंस के लिए अलग नहीं होगा. हालांकि, उन इंस्टेंस के लिए रेफ़रंस की ज़रूरत पड़ सकती है—उदाहरण के लिए, कॉन्फ़िगरेशन की शेयर की गई जानकारी. स्टैटिक मेथड अक्सर किसी क्लास के इंस्टेंस के साथ काम करने के लिए यूटिलिटी फ़ंक्शन होते हैं. जैसे, किसी फ़ील्ड में इंस्टेंस की तुलना करना या उन्हें क्रम से लगाना.

क्लास के मुख्य हिस्से में स्टैटिक फ़ील्ड और तरीके तय करने के लिए, static का इस्तेमाल करें:

class MyClass {
    static myStaticField;
    static myStaticMethod() {}
}
const myClassInstance = new MyClass();

स्टैटिक तरीका बनाने के लिए डॉट नोटेशन का भी इस्तेमाल किया जा सकता है:

class MyClass {
    constructor() {}
}
MyClass.myStaticMethod = function() {}

स्टैटिक प्रॉपर्टी को उनकी क्लास के किसी इंस्टेंस से ऐक्सेस नहीं किया जा सकता. हालांकि, वे क्लास कंस्ट्रक्टर पर उपलब्ध हैं:

class MyClass {
    static myStaticField = true;
    static myStaticMethod() {
        console.log( "A static method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance.myStaticField;
> undefined

myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function

MyClass.myStaticField;
> true

MyClass.myStaticMethod();
> "A static method."

ये तकनीकी रूप से ज़रूरी नहीं हैं, लेकिन क्लास के इंस्टेंस के साथ काम करने के लिए, स्टैटिक तरीकों का इस्तेमाल करना सबसे सही तरीका है. इसके उदाहरणों में, क्लास के इंस्टेंस को क्रम से लगाने के लिए बना स्टैटिक तरीका या स्टैटिक फ़ैक्ट्री वाला तरीका शामिल हो सकता है. इसमें क्लास का इंस्टेंस बनाने के लिए ज़रूरी सेट अप शामिल होता है और फिर क्लास इंस्टेंस को दिखाता है:

class User {
    constructor( name, email ) {
        this.name = name;
        this.email = email;
    }
    static fromObject( myObject ) {
        return new User( myObject.name, myObject.email ?? "Omitted" );
    }
}
const userObject = {
    "name" : "My Name",
    "email" : "my@email.address"
};
const secondUserObject = {
    "name" : "My Name"
};

const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );

firstUser;
> Object { name: "My Name", email: "my@email.address" }

secondUser;
> Object { name: "My Name", email: "Omitted" }

जांचें कि आपको कितना समझ आया

इनमें से किस तरह के फ़ील्ड को सिर्फ़ क्लास के अंदर से ऐक्सेस किया जा सकता है?

निजी फ़ील्ड
क्लास फ़ील्ड
Static fields