समझें कि this गतिशील रूप से कैसे हल होता है, प्रोटोटाइप चेन कैसे काम करती है, और क्लासेस असल में ऑब्जेक्ट मॉडल में क्या जोड़ती हैं।
इस पाठ को Kodokon में खोलेंthis की वैल्यू कॉल साइट पर तय होती है, घोषणा के समय नहीं। घटते क्रम में चार नियम: new के साथ कॉल करना, स्पष्ट बाइंडिंग (call, apply, bind), मेथड की तरह कॉल करना (obj.fn()), और सादा कॉल (fn()), जो स्ट्रिक्ट मोड में undefined देता है। वास्तविक दुनिया की सबसे आम बग सीधे इसी से आती है: किसी मेथड को उसके ऑब्जेक्ट से निकाल लेना अंतर्निहित बाइंडिंग को तोड़ देता है।
const user = {
name: "Ada",
greet() {
return "Hello, " + this.name;
},
};
console.log(user.greet()); // "Hello, Ada"
const detached = user.greet;
// detached(); // TypeError: this is undefined
const bound = user.greet.bind(user);
console.log(bound()); // "Hello, Ada"एरो फंक्शन्स का अपना कोई this नहीं होता: वे उसे आसपास के स्कोप से लेक्सिकल रूप से कैप्चर करते हैं, ठीक किसी क्लोज़र की तरह। यह उन्हें कॉलबैक के लिए आदर्श बनाता है, पर ऑब्जेक्ट लिटरल पर मेथड के रूप में उलटा नुकसानदेह, जहाँ this बाहरी स्कोप की ओर इशारा करेगा। भीतर की बात यह है कि हर ऑब्जेक्ट अपनी प्रोटोटाइप चेन के ज़रिए डेलिगेट करता है: कोई गायब प्रॉपर्टी कड़ी-दर-कड़ी तब तक खोजी जाती है जब तक null तक न पहुँच जाए।
function Animal(name) {
this.name = name;
}
Animal.prototype.describe = function () {
return this.name + " is an animal";
};
const dog = new Animal("Rex");
console.log(dog.describe()); // "Rex is an animal"
console.log(Object.getPrototypeOf(dog) ===
Animal.prototype); // true
console.log(dog.hasOwnProperty("describe")); // falseclass सिंटैक्स इस मॉडल को बदलता नहीं है: यह उसे पठनीय बनाता है। क्लास बॉडी में घोषित मेथड्स Constructor.prototype पर उतरते हैं और इसलिए साझा होते हैं। इंस्टेंस फ़ील्ड्स (फ़ील्ड के रूप में असाइन किए गए एरो फंक्शन्स समेत) प्रति इंस्टेंस दोबारा बनते हैं: पक्की this बाइंडिंग, पर बढ़ी हुई मेमोरी लागत। अंत में, #private फ़ील्ड्स इंजन द्वारा लागू की गई प्राइवेसी देते हैं, _अंडरस्कोर वाली परंपरा के विपरीत।
class BankAccount {
#balance = 0;
deposit(amount) {
if (amount <= 0) throw new Error("Invalid amount");
this.#balance += amount;
return this;
}
get balance() {
return this.#balance;
}
}
const account = new BankAccount();
account.deposit(50).deposit(25);
console.log(account.balance); // 75fn() के दौरान this क्या होता है?this के संबंध में एरो फंक्शन की खास बात क्या है?