আমি এই বিশেষ আচরণটি বুঝতে গভীরভাবে খনন করেছি এবং আমি মনে করি আমি একটি ভাল ব্যাখ্যা পেয়েছি।
আপনি কেন উপনাম রাখতে পারছেন না সে সম্পর্কে প্রবেশ করার আগে আমি 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
এখন ফিরে আসবে ।200
getAge
dave
উপরের সব কিসের কথা? আপনার জাভাস্ক্রিপ্ট অবজেক্টের সাথে ফাংশনগুলি 'আলগাভাবে' সংযুক্ত। যেমন আপনি করতে পারেন
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
। :)