আপডেট 2015: 7 ম এর উত্তর
দ্বারা চিহ্নিত হিসাবে , এখন যে ES6 (ECMAScript 2015) চূড়ান্ত করা হয়েছে, আরও উপযুক্ত ডকুমেন্টেশন এখন উপলব্ধ:
মূল উত্তর ((historicতিহাসিক) বোঝার জন্য এবং অতিরিক্ত উদাহরণগুলির জন্য) :
Reflection proposalথেকে অগ্রগতির হয়েছে বলে মনে হয় খসড়া নাম ECMAScript 6 স্পেসিফিকেশন । এই দস্তাবেজটি বর্তমানে- Reflectঅবজেক্টের পদ্ধতিগুলির রূপরেখা দেয় এবং কেবল Reflect-অবজেক্ট সম্পর্কে নিজেই নিম্নলিখিতটি জানিয়ে দেয়:
প্রতিবিম্ব বস্তু একটি একক সাধারণ বস্তু।
প্রতিচ্ছবি বস্তুর অভ্যন্তরীণ স্লটের মান [[প্রোটোটাইপ]] মান অন্তর্নির্মিত অবজেক্ট প্রোটোটাইপ অবজেক্ট (19.1.3)।
প্রতিবিম্ব বস্তু কোনও ফাংশন অবজেক্ট নয়। এটির [[নির্মাণ]] অভ্যন্তরীণ পদ্ধতি নেই; নতুন অপারেটরের সাথে কনস্ট্রাক্টর হিসাবে রিফ্লেক অবজেক্টটি ব্যবহার করা সম্ভব নয় । প্রতিবিম্ব বস্তুর একটি [[কল]] অভ্যন্তরীণ পদ্ধতিও নেই; রিফ্লেক্ট অবজেক্টটিকে কোনও ফাংশন হিসাবে ডেকে আনা সম্ভব নয়।
তবে ইএস হারমোনিতে এর উদ্দেশ্য সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা রয়েছে :
"@ পুনরায় নির্বাচন" মডিউলটি একাধিক উদ্দেশ্যে কাজ করে:
- এখন আমাদের মডিউলগুলি রয়েছে, একটি "@ পুনঃনির্বাচিত" মডিউল হ'ল পূর্বে অবজেক্টে সংজ্ঞায়িত প্রতিবিম্ব পদ্ধতির অনেক বেশি প্রাকৃতিক জায়গা। পিছনের দিকে সামঞ্জস্যের উদ্দেশ্যে, অবজেক্টের স্থির পদ্ধতি অদৃশ্য হওয়ার সম্ভাবনা নেই। তবে নতুন পদ্ধতি সম্ভবত অবজেক্ট কনস্ট্রাক্টরের পরিবর্তে "@ পুনরায় নির্বাচন" মডিউলে যুক্ত করা উচিত।
- বিশ্বব্যাপী প্রক্সি বাইন্ডিংয়ের প্রয়োজনীয়তা এড়িয়ে প্রক্সিগুলির জন্য একটি প্রাকৃতিক হোম।
- এই মডিউলটির বেশিরভাগ পদ্ধতি প্রক্সি ট্র্যাপগুলিতে একের পর এক মানচিত্র করে। প্রক্সি হ্যান্ডলারের সুবিধার্থে অপারেশনগুলি ফরোয়ার্ড করার জন্য এই পদ্ধতিগুলির প্রয়োজন রয়েছে, যেমন নীচে দেখানো হয়েছে।
সুতরাং, Reflectঅবজেক্টটি বেশ কয়েকটি ইউটিলিটি ফাংশন সরবরাহ করে, যার মধ্যে অনেকগুলি বিশ্বব্যাপী অবজেক্টে সংজ্ঞায়িত ES5 পদ্ধতিগুলির সাথে ওভারল্যাপ করে প্রদর্শিত হয়।
যাইহোক, এটি প্রকৃতপক্ষে কোন বিদ্যমান সমস্যাগুলি সমাধান করতে ইচ্ছুক বা কোন কার্যকারিতা যুক্ত রয়েছে তা ব্যাখ্যা করে না। আমার সন্দেহ হয়েছিল যে এটি শিমযুক্ত হতে পারে এবং সত্যই, উপরোক্ত সম্প্রীতি-নির্দিষ্ট লিঙ্কগুলি 'অ-আদর্শিক, এই পদ্ধতিগুলির আনুমানিক বাস্তবায়নের' সাথে যুক্ত রয়েছে ।
এই কোডটি পরীক্ষা করে এর ব্যবহার সম্পর্কে ধারণাটি (আরও) দেওয়া যেতে পারে, তবে ধন্যবাদ একটি উইকিও রয়েছে যা প্রতিবিম্বিত বস্তুটি কার্যকর হওয়ার কারণগুলির বিভিন্ন কারণের রূপরেখা দেয় :
(আমি সেই লেখাটি থেকে ভবিষ্যতের রেফারেন্সের জন্য নিম্নলিখিত পাঠ্যটি অনুলিপি করেছি (এবং ফর্ম্যাট করেছি)) উত্স হিসাবে তাদের একমাত্র উদাহরণ আমি পেয়েছি that এছাড়াও, তারা বোঝায়, ইতিমধ্যে একটি ভাল ব্যাখ্যা আছে এবং প্রশ্নের applyউদাহরণ স্পর্শ করে ))
আরও কার্যকর ফেরতের মান values
এর মধ্যে অনেকগুলি অপারেশন Reflectইএস 5 অপারেশনের সাথে সংজ্ঞাযুক্ত Object, যেমন Reflect.getOwnPropertyDescriptorএবং Reflect.defineProperty। যাইহোক, যেহেতু Object.defineProperty(obj, name, desc)পারেন ফিরে আসবে objযখন সম্পত্তি সফলভাবে সংজ্ঞায়িত হয়েছে, অথবা নিক্ষেপ একটি TypeErrorঅন্যথায়, Reflect.defineProperty(obj, name, desc)কেবল একটি বুলিয়ান ইঙ্গিত করে যে থাকুক বা না থাকুক সম্পত্তি সফলভাবে সংজ্ঞায়িত করা হয় ফিরে যাও specced করা হয়। এটি আপনাকে এই কোডটি রিফ্যাক্টর করতে দেয়:
try {
Object.defineProperty(obj, name, desc);
} catch (e) {
}
এটি:
if (Reflect.defineProperty(obj, name, desc)) {
} else {
}
অন্যান্য পদ্ধতিগুলি যেমন বুলিয়ান সাফল্যের স্থিতি ফিরিয়ে দেয় সেগুলি হ'ল Reflect.set(কোনও সম্পত্তি আপডেট করা), Reflect.deleteProperty(কোনও সম্পত্তি মুছতে), Reflect.preventExtensions(কোনও বস্তুকে অ-এক্সটেনসিবল করতে) এবং Reflect.setPrototypeOf(কোনও সামগ্রীর প্রোটোটাইপ লিঙ্কটি আপডেট করার জন্য)।
প্রথম শ্রেণির ক্রিয়াকলাপ
ES5- তে কোনও বস্তুর objনির্দিষ্ট সম্পত্তি নাম সংজ্ঞায়িত করা বা উত্তরাধিকারসূত্রে পাওয়া যায় কিনা তা সনাক্ত করার উপায় (name in obj)। একইভাবে, কোনও সম্পত্তি মুছতে, একজন ব্যবহার করে delete obj[name]। ডেডিকেটেড সিনট্যাক্সটি দুর্দান্ত এবং সংক্ষিপ্ত হলেও এর অর্থ হ'ল আপনি যখন প্রথম শ্রেণীর মান হিসাবে অপারেশনটি পাস করতে চান তখন আপনাকে অবশ্যই এই ক্রিয়াকলাপগুলিকে স্পষ্টভাবে আবদ্ধ করতে হবে।
এর সাথে Reflect, এই অপারেশনগুলি সহজেই প্রথম-শ্রেণীর ফাংশন হিসাবে সংজ্ঞায়িত করা হয়:
Reflect.has(obj, name)এটি হ'ল কার্যকরী সমতুল্য (name in obj)এবং Reflect.deleteProperty(obj, name)এটি একটি ফাংশন যা একই কাজ করেdelete obj[name].
আরও নির্ভরযোগ্য ফাংশন অ্যাপ্লিকেশন
ES5-এ, যখন কেউ fঅ্যারে হিসাবে প্যাক করা argsএবং thisমানটিকে বাঁধাই করে একটি চলক সংখ্যক যুক্তিযুক্ত একটি ফাংশন কল করতে চায়, তখন কেউ objলিখতে পারেন:
f.apply(obj, args)
তবে, fএমন কোনও বস্তু হতে পারে যা ইচ্ছাকৃতভাবে বা অজান্তেই তার নিজস্ব applyপদ্ধতিটি সংজ্ঞায়িত করে । যখন আপনি সত্যিই নিশ্চিত করতে চান যে বিল্ট-ইন applyফাংশনটি ডেকে আনা হয়েছে, একজন সাধারণত লিখেছেন:
Function.prototype.apply.call(f, obj, args)
কেবল এই ক্রিয়াপদই নয়, এটি দ্রুত বোঝা শক্ত হয়ে যায়। এর মাধ্যমে Reflect, আপনি এখন একটি সংক্ষিপ্ত এবং সহজে বোঝার উপায়ে একটি নির্ভরযোগ্য ফাংশন কল করতে পারেন:
Reflect.apply(f, obj, args)
পরিবর্তনশীল-যুক্তি নির্মাণকারী
কল্পনা করুন আপনি একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট সহ একটি কনস্ট্রাক্টর ফাংশন কল করতে চান। ES6 এ, নতুন স্প্রেড সিনট্যাক্সের জন্য ধন্যবাদ, এর মতো কোড লেখা সম্ভব হবে:
var obj = new F(...args)
ES5-এ, এটি লেখা শক্ত, কারণ কেবলমাত্র একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট সহ একটি ফাংশনটি ব্যবহার করতে F.applyবা F.callকল F.constructকরতে পারে newতবে ভেরিয়েবল সংখ্যার সাথে ফাংশনে কোনও ফাংশন নেই । সহ Reflect, এখন ES5- তে লিখতে পারবেন:
var obj = Reflect.construct(F, args)
প্রক্সি ফাঁদগুলির জন্য ডিফল্ট ফরোয়ার্ডিং আচরণ
Proxyবিদ্যমান অবজেক্টগুলিকে মোড়ানোর জন্য অবজেক্টগুলি ব্যবহার করার সময়, কোনও ক্রিয়াকলাপকে বাধা দেওয়া, কিছু করা এবং তারপরে "ডিফল্ট জিনিসটি" করা খুব সাধারণ বিষয়, যা সাধারণত মোড়ানো অবজেক্টটিতে আটকানো অপারেশন প্রয়োগ করা হয়। উদাহরণস্বরূপ, বলুন যে আমি কোনও সামগ্রীতে সমস্ত সম্পত্তি অ্যাক্সেসগুলি কেবল লগ করতে চাই obj:
var loggedObj = new Proxy(obj, {
get: function(target, name) {
console.log("get", target, name);
}
});
Reflectএবং ProxyAPI গুলি টমটম ডিজাইন করা হয়েছে , প্রতিটি জন্য যেমন যে Proxyফাঁদ, একটি সংশ্লিষ্ট পদ্ধতি বিদ্যমান উপর Reflectযে "ডিফল্ট জিনিস আছে"। সুতরাং, যখনই আপনি কোনও প্রক্সি হ্যান্ডলারের অভ্যন্তরে নিজেকে "ডিফল্ট করুন" করতে চাইছেন, সঠিক জিনিসটি হ'ল Reflectঅবজেক্টের সাথে সম্পর্কিত পদ্ধতিটিকে সর্বদা কল করা :
var loggedObj = new Proxy(obj, {
get: function(target, name) {
console.log("get", target, name);
return Reflect.get(target, name);
}
});
এর রিটার্ন টাইপ Reflectপদ্ধতি রিটার্ন টাইপ সঙ্গে সামঞ্জস্যপূর্ণ হতে নিশ্চিত করা হয় Proxyযাত্রীর সঙ্গের নিজলটবহর।
অ্যাক্সেসরদের এই বাঁধাই নিয়ন্ত্রণ করুন
ইএস 5 এ জেনেরিক সম্পত্তি অ্যাক্সেস বা সম্পত্তি আপডেট করা মোটামুটি সহজ। এই ক্ষেত্রে:
var name = ...
obj[name]
obj[name] = value
Reflect.getএবং Reflect.setপদ্ধতি আপনি একই জিনিস করতে, কিন্তু অতিরিক্ত একটি শেষ উপায় ঐচ্ছিক আর্গুমেন্ট হিসাবে গ্রহণ করার অনুমতি receiverপরামিতি যে আপনি স্পষ্টভাবে সেট করতে পারবেন this-binding যখন সম্পত্তি যে আপনি পেতে / সেট একটি অ্যাকসেসর হল:
var name = ...
Reflect.get(obj, name, wrapper)
Reflect.set(obj, name, value, wrapper)
আপনি মোড়ানোর সময় এটি কখনও কখনও কার্যকর হয় objএবং আপনি নিজের মোড়কের কাছে আবার প্রবেশের জন্য অ্যাকসেসরের মধ্যে কোনও স্ব-প্রেরণ চান, যেমন obj:
var obj = {
get foo() { return this.bar(); },
bar: function() { ... }
}
কলিং Reflect.get(obj, "foo", wrapper)কারণ হবে this.bar()কলে rerouted করতে wrapper।
উত্তরাধিকার এড়িয়ে চলুন __proto__
কিছু ব্রাউজারগুলিতে __proto__একটি বিশেষ সম্পত্তি হিসাবে সংজ্ঞায়িত করা হয় যা কোনও অবজেক্টের প্রোটোটাইপে অ্যাক্সেস দেয়। Object.getPrototypeOf(obj)প্রোটোটাইপ অনুসন্ধানের জন্য ES5 একটি নতুন পদ্ধতি মানক করেছে। Reflect.getPrototypeOf(obj)হুবহু একই কাজ করে, বস্তুটির প্রোটোটাইপ সেট করতে Reflectএকটি সংজ্ঞায়িত করে except Reflect.setPrototypeOf(obj, newProto)এটি কোনও বস্তুর প্রোটোটাইপ আপডেট করার নতুন ES6- অনুসারী way
লক্ষ্য করুন: setPrototypeOf এছাড়াও বিদ্যমানObject (যেমন সঠিকভাবে দ্বারা নির্দিষ্ট Knu এর মন্তব্য )!
সম্পাদনা:
সাইড-নোট (Q- তে মন্তব্যগুলিকে সম্বোধন করা): 'প্রশ্ন: ES6 মডিউল বনাম HTML টি আমদানি'-এর একটি সংক্ষিপ্ত এবং সহজ উত্তর রয়েছে যা ব্যাখ্যা করে Realmsএবং Loaderঅবজেক্ট করে।
এই লিঙ্কটি দিয়ে আরও একটি ব্যাখ্যা দেওয়া হয়েছে :
একটি রিয়েলম অবজেক্ট তার নিজস্ব গ্লোবাল অবজেক্ট, স্ট্যান্ডার্ড লাইব্রেরিটির অনুলিপি এবং "আন্তঃব্যবস্থা" (অবজেক্ট.প্রোটোটাইপের প্রাথমিক মানের মতো গ্লোবাল ভেরিয়েবলের সাথে আবদ্ধ নয় এমন স্ট্যান্ডার্ড অবজেক্ট) সহ একটি স্বতন্ত্র বৈশ্বিক পরিবেশের ধারণাকে বিমুগ্ধ করে।
এক্সটেনসিবল ওয়েব : <iframe>এটি ডিওএম ছাড়াই একই-উত্সের গতিশীল সমতুল্য
।
যদিও উল্লেখযোগ্য মূল্য: এগুলি এখনও খসড়াতে রয়েছে, এটি পাথর দ্বারা রচিত কোনও স্পেসিফিকেশন নয়! এটি ES6, তাই ব্রাউজার-সামঞ্জস্যতা মাথায় রাখুন!
আশাকরি এটা সাহায্য করবে!
Reflectশুধু জন্য একটি ধারকRealmএবংLoaderবস্তু, কিন্তু আমি কি পরেরটির পারেন না জানি না।