আমি এই বিশেষ আচরণটি বুঝতে গভীরভাবে খনন করেছি এবং আমি মনে করি আমি একটি ভাল ব্যাখ্যা পেয়েছি।
আপনি কেন উপনাম রাখতে পারছেন না সে সম্পর্কে প্রবেশ করার আগে আমি document.getElementByIdজাভাস্ক্রিপ্ট ফাংশন / অবজেক্টগুলি কীভাবে কাজ করে তা বোঝানোর চেষ্টা করব।
আপনি যখনই কোনও জাভাস্ক্রিপ্ট ফাংশন শুরু করবেন তখনই জাভাস্ক্রিপ্ট ইন্টারপ্রেটার কোনও সুযোগ নির্ধারণ করে এটি ফাংশনে পাস করে।
নিম্নলিখিত ফাংশন বিবেচনা করুন:
function sum(a, b)
{
return a + b;
}
sum(10, 20);
এই ফাংশনটি উইন্ডো স্কোপে ঘোষণা করা হয় এবং আপনি যখন এটিটি thisযোগ করেন তখন যোগফলের অভ্যন্তরের মানটি বিশ্বব্যাপী Windowঅবজেক্ট হবে।
'যোগফল' ফাংশনের জন্য, এটি ব্যবহার না করে 'এটি' এর মান কী তা বিবেচ্য নয়।
নিম্নলিখিত ফাংশন বিবেচনা করুন:
function Person(birthDate)
{
this.birthDate = birthDate;
this.getAge = function() { return new Date().getFullYear() - this.birthDate.getFullYear(); };
}
var dave = new Person(new Date(1909, 1, 1));
dave.getAge();
আপনি যখন dave.getAge ফাংশনটি কল করেন, জাভাস্ক্রিপ্ট ইন্টারপ্রেটার দেখতে পাবে যে আপনি daveঅবজেক্টে getAge ফাংশনটি কল করছেন , সুতরাং এটি ফাংশনটিতে সেট thisকরে daveএবং কল করে getAge। getAge()সঠিকভাবে ফিরে আসবে 100।
আপনি হয়ত জানেন যে জাভাস্ক্রিপ্টে আপনি applyপদ্ধতিটি ব্যবহার করে সুযোগটি নির্দিষ্ট করতে পারেন । এর চেষ্টা করা যাক।
var dave = new Person(new Date(1909, 1, 1));
var bob = new Person(new Date(1809, 1, 1));
dave.getAge.apply(bob);
উপরের লাইনে জাভাস্ক্রিপ্ট স্কোপটি সিদ্ধান্ত না দেওয়ার পরিবর্তে আপনি bobবস্তু হিসাবে ম্যানুয়ালি স্কোপটি অতিক্রম করছেন । আপনি বস্তুটির বিষয়ে 'ভেবেছিলেন' তবুও getAgeএখন ফিরে আসবে ।200getAgedave
উপরের সব কিসের কথা? আপনার জাভাস্ক্রিপ্ট অবজেক্টের সাথে ফাংশনগুলি 'আলগাভাবে' সংযুক্ত। যেমন আপনি করতে পারেন
var dave = new Person(new Date(1909, 1, 1));
var bob = new Person(new Date(1809, 1, 1));
bob.getAge = function() { return -1; };
bob.getAge();
dave.getAge();
এর পরবর্তী পদক্ষেপ নেওয়া যাক।
var dave = new Person(new Date(1909, 1, 1));
var ageMethod = dave.getAge;
dave.getAge();
ageMethod();
ageMethodফাঁসি কার্যকর করে ত্রুটি! কি হলো?
আপনি যদি আমার উপরোক্ত বিষয়গুলি মনোযোগ সহকারে পড়েন তবে আপনি নোট করবেন যে dave.getAgeপদ্ধতিটিকে বস্তু daveহিসাবে ডেকে আনা হয়েছিল thisযেখানে জাভাস্ক্রিপ্ট ageMethodসম্পাদনের জন্য 'সুযোগ' নির্ধারণ করতে পারে নি । সুতরাং এটি বিশ্বব্যাপী 'উইন্ডো' কে 'এটি' হিসাবে পাস করেছে। Now এর মত windowএকটি নেই birthDateসম্পত্তি,ageMethod ফাঁসি ব্যর্থ হবে।
কিভাবে এটি ঠিক করবেন? সরল,
ageMethod.apply(dave);
উপরের সমস্ত কি বোঝায়? যদি এটি হয়, তবে আপনি কেন উপনামটি করতে সক্ষম নন তা আপনি ব্যাখ্যা করতে সক্ষম হবেন document.getElementById:
var $ = document.getElementById;
$('someElement');
$সঙ্গে বলা হয় windowযেমন thisযদি getElementByIdবাস্তবায়ন আশা করছে thisহতে document, এটা ব্যর্থ হবে।
আবার এটি ঠিক করার জন্য, আপনি এটি করতে পারেন
$.apply(document, ['someElement']);
তাহলে এটি ইন্টারনেট এক্সপ্লোরারে কেন কাজ করে?
আমি অভ্যন্তরীণ বাস্তবায়ন জানি না getElementByIdআইই এ, কিন্তু jQuery উৎস (একটি মন্তব্য inArray, পদ্ধতি বাস্তবায়ন) বলছেন যে IE তে window == document। যদি এটি হয়, তবে আলিয়াসিংdocument.getElementById উচিত আইই তে কাজ করা।
এটি আরও চিত্রিত করার জন্য, আমি একটি বিস্তৃত উদাহরণ তৈরি করেছি। কটাক্ষপাত আছে Personনিচে ফাংশন।
function Person(birthDate)
{
var self = this;
this.birthDate = birthDate;
this.getAge = function()
{
if(this.constructor == Person)
return new Date().getFullYear() - this.birthDate.getFullYear();
else
return -1;
};
this.getAgeSmarter = function()
{
return self.getAge();
};
this.getAgeSmartest = function()
{
var scope = this.constructor == Person ? this : self;
return scope.getAge();
};
}
Personউপরের ফাংশনটির জন্য , বিভিন্ন getAgeপদ্ধতি কীভাবে আচরণ করবে তা এখানে's
Personফাংশন ব্যবহার করে দুটি বস্তু তৈরি করা যাক ।
var yogi = new Person(new Date(1909, 1,1));
var anotherYogi = new Person(new Date(1809, 1, 1));
console.log(yogi.getAge());
সোজা এগিয়ে, getAge পদ্ধতি yogiহিসাবে thisএবং আউটপুট বস্তু পায় 100।
var ageAlias = yogi.getAge;
console.log(ageAlias());
জাভাস্ক্রিপ্ট ইন্টিপ্লেটার windowবস্তু হিসাবে সেট করে thisএবং আমাদের getAgeপদ্ধতিটি ফিরে আসবে -1।
console.log(ageAlias.apply(yogi));
যদি আমরা সঠিক সুযোগটি সেট করি তবে আপনি ageAliasপদ্ধতিটি ব্যবহার করতে পারেন ।
console.log(ageAlias.apply(anotherYogi));
আমরা যদি অন্য কোনও ব্যক্তির অবজেক্টে পাস করি তবে এটি বয়সকে সঠিকভাবে গণনা করবে।
var ageSmarterAlias = yogi.getAgeSmarter;
console.log(ageSmarterAlias());
ageSmarterফাংশন মূল বন্দী thisবস্তুর তাই এখন আপনি সঠিক সুযোগ সরবরাহের সম্পর্কে চিন্তা করতে হবে না।
console.log(ageSmarterAlias.apply(anotherYogi));
সমস্যাটি ageSmarterহ'ল আপনি কখনই অন্য কোনও বস্তুর জন্য সুযোগটি সেট করতে পারবেন না।
var ageSmartestAlias = yogi.getAgeSmartest;
console.log(ageSmartestAlias());
console.log(ageSmartestAlias.apply(document));
ageSmartestফাংশন মূল সুযোগ যদি একটি অবৈধ সুযোগ সরবরাহ করা হয় ব্যবহার করবে।
console.log(ageSmartestAlias.apply(anotherYogi));
আপনি এখনও অন্য একটি Personবস্তুকে পাস করতে সক্ষম হবেন getAgeSmartest। :)