২০১৩ এবং ২০১৫ আপডেট (২০১১ সালের মূল উত্তরের জন্য নীচে দেখুন) :
এটি ES2015 (ওরফে "ES6") স্পেসিফিকেশন হিসাবে পরিবর্তিত হয়েছে: জাভাস্ক্রিপ্টে এখন প্রক্সি রয়েছে । প্রক্সিগুলি আপনাকে এমন অবজেক্ট তৈরি করতে দেয় যা অন্যান্য অবজেক্টের (প্রকৃত দিকে) প্রকৃত প্রক্সি হয়। এখানে একটি সরল উদাহরণ যা কোনও সম্পত্তি মানকে পুনরুদ্ধার করার জন্য সমস্ত ক্যাপগুলিতে স্ট্রিং করে:
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let original = {
"foo": "bar"
};
let proxy = new Proxy(original, {
get(target, name, receiver) {
let rv = Reflect.get(target, name, receiver);
if (typeof rv === "string") {
rv = rv.toUpperCase();
}
return rv;
}
});
console.log(`original.foo = ${original.foo}`); // "original.foo = bar"
console.log(`proxy.foo = ${proxy.foo}`); // "proxy.foo = BAR"
আপনি যে কাজগুলিকে ওভাররাইড করবেন না তাদের তাদের ডিফল্ট আচরণ রয়েছে। উপরের দিকে, আমরা ওভাররাইড করা সমস্ত হ'ল get
তবে আপনি যে ক্রিয়াকলাপটি করতে পারেন তার একটি সম্পূর্ণ তালিকা রয়েছে।
ইন get
হ্যান্ডলার ফাংশনের আর্গুমেন্ট তালিকা:
target
বস্তুটি কি প্রক্সিড হয় ( original
আমাদের ক্ষেত্রে)।
name
(অবশ্যই) সম্পত্তি পুনরুদ্ধারের নাম, যা সাধারণত স্ট্রিং হয় তবে এটি একটি চিহ্নও হতে পারে।
receiver
this
সম্পত্তি হ'ল ডেটা প্রপার্টিটির পরিবর্তে অ্যাক্সেসর হলে সেই অবজেক্টটি গেটর ফাংশন হিসাবে ব্যবহার করা উচিত । স্বাভাবিক যদি এই প্রক্সি বা কিছু তা থেকে উত্তরাধিকারী, কিন্তু এটা যে করতে কিছু হওয়ার পর থেকে ফাঁদ দ্বারা আলোড়ন সৃষ্টি করা যেতে পারে Reflect.get
।
এটি আপনাকে যে সমস্ত ক্যাচ-অল গেটর এবং সেটার বৈশিষ্ট্যটি চায় তা দিয়ে একটি বস্তু তৈরি করতে দেয়:
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let obj = new Proxy({}, {
get(target, name, receiver) {
if (!Reflect.has(target, name)) {
console.log("Getting non-existent property '" + name + "'");
return undefined;
}
return Reflect.get(target, name, receiver);
},
set(target, name, value, receiver) {
if (!Reflect.has(target, name)) {
console.log(`Setting non-existent property '${name}', initial value: ${value}`);
}
return Reflect.set(target, name, value, receiver);
}
});
console.log(`[before] obj.foo = ${obj.foo}`);
obj.foo = "bar";
console.log(`[after] obj.foo = ${obj.foo}`);
উপরের ফলাফল:
অস্তিত্বের সম্পত্তি 'ফু' পাওয়া
[আগে] obj.foo = অপরিবর্তিত
অস্তিত্বের সম্পত্তি 'foo' সেট করা হচ্ছে, প্রাথমিক মান: বার
[পরে] obj.foo = বার bar
আমরা কীভাবে "অস্তিত্বহীন" বার্তাটি পাই foo
তা যখন আমরা উপস্থিত নেই তখন পুনরুদ্ধার করার চেষ্টা করি এবং আবার কখন এটি তৈরি করি, তবে তার পরে নয় Note
২০১১ থেকে উত্তর (২০১৩ এবং ২০১৫ আপডেটের জন্য উপরে দেখুন) :
না, জাভাস্ক্রিপ্টে ক্যাচ-অল প্রপার্টি বৈশিষ্ট্য নেই। আপনি যে অ্যাকসেসর সিনট্যাক্সটি ব্যবহার করছেন তা অনুচ্ছেদটির 11.1.5 অনুচ্ছেদে আচ্ছাদিত এবং কোনও ওয়াইল্ডকার্ড বা এর মতো কিছু সরবরাহ করে না।
আপনি অবশ্যই এটি করার জন্য কোনও ফাংশন বাস্তবায়ন করতে পারেন, তবে আমি অনুমান করছি আপনি সম্ভবত এটির f = obj.prop("foo");
চেয়ে f = obj.foo;
এবং obj.prop("foo", value);
তার চেয়ে বেশি ব্যবহার করতে চান না obj.foo = value;
(যা অজানা সম্পত্তি পরিচালনা করতে ফাংশনের জন্য প্রয়োজনীয় হবে)।
এফডাব্লুআইডাব্লু, গিটার ফাংশন (আমি সেটার যুক্তির সাথে বিরক্ত করিনি) এরকম কিছু দেখবে:
MyObject.prototype.prop = function(propName) {
if (propName in this) {
// This object or its prototype already has this property,
// return the existing value.
return this[propName];
}
// ...Catch-all, deal with undefined property here...
};
তবে আবারও, আমি ভাবতে পারি না যে আপনি কীভাবে এটি করতে চান তা কীভাবে আপনি কীভাবে এটি ব্যবহার করেন তা পরিবর্তনের কারণে use