আমি জানি যে এটি জিজ্ঞাসা করার পরে এটি 1 দশকেরও বেশি হয়ে গেছে, তবে আমি আমার প্রোগ্রামার জীবনে এন-তম বারের জন্য এই বিষয়ে আমার চিন্তাভাবনা রেখেছি এবং একটি সম্ভাব্য সমাধান পেয়েছি যা আমি জানি না যে আমি এখনও পুরোপুরি পছন্দ করি কিনা । আমি এই পদ্ধতিটি আগে নথিভুক্ত দেখিনি, তাই আমি এটিকে "ব্যক্তিগত / পাবলিক ডলার প্যাটার্ন" বা _ $ / $ প্যাটার্নটির নাম দেব ।
var ownFunctionResult = this.$("functionName"[, arg1[, arg2 ...]]);
var ownFieldValue = this._$("fieldName"[, newValue]);
var objectFunctionResult = objectX.$("functionName"[, arg1[, arg2 ...]]);
//Throws an exception. objectX._$ is not defined
var objectFieldValue = objectX._$("fieldName"[, newValue]);
ধারণাটি একটি শ্রেণিবদ্ধকরণ ফাংশন ব্যবহার করে যা একটি কনস্ট্রাক্টর ফাংশন দেয় যা একটি ইন্টারফেস অবজেক্ট ফেরত দেয় । ইন্টারফেসের একমাত্র পদ্ধতিটি $
যা name
কনস্ট্রাক্টর অবজেক্টে সংশ্লিষ্ট ফাংশনটি name
আহ্বানের জন্য একটি আর্গুমেন্ট গ্রহণ করে, অনুরোধে পাস হওয়ার পরে যে কোনও অতিরিক্ত যুক্তি পাস হয়ে যায়।
বিশ্বব্যাপী সংজ্ঞায়িত সহায়ক ফাংশন প্রয়োজন হিসাবে একটিClassValues
ক্ষেত্রের সমস্ত ক্ষেত্র সঞ্চয় করে । এটি তাদের অ্যাক্সেস করার জন্য ফাংশনটি সংজ্ঞায়িত করে । এটি একটি সংক্ষিপ্ত গেট / সেট প্যাটার্ন অনুসরণ করে সুতরাং যদি পাস করা হয় তবে এটি নতুন ভেরিয়েবল মান হিসাবে ব্যবহৃত হবে।_$
name
value
var ClassValues = function (values) {
return {
_$: function _$(name, value) {
if (arguments.length > 1) {
values[name] = value;
}
return values[name];
}
};
};
বিশ্বব্যাপী সংজ্ঞায়িত ফাংশনটি Interface
একটি একক ফাংশন সহ Values
একটি ফেরত দিতে একটি অবজেক্ট এবং একটি অবজেক্ট নেয় যা প্যারামিটারের নাম অনুসারে কোনও ফাংশন সন্ধান করতে পরীক্ষা করে এবং এটিকে স্কোপড অবজেক্ট হিসাবে ডাকে । অতিরিক্ত আর্গুমেন্টগুলি পাস করা হবে ফাংশন অনুরোধে পাস করা হবে।_interface
$
obj
name
values
$
var Interface = function (obj, values, className) {
var _interface = {
$: function $(name) {
if (typeof(obj[name]) === "function") {
return obj[name].apply(values, Array.prototype.splice.call(arguments, 1));
}
throw className + "." + name + " is not a function.";
}
};
//Give values access to the interface.
values.$ = _interface.$;
return _interface;
};
নীচের নমুনায়, ফাংশন যা ClassX
ফলাফল নির্ধারিত হয় । যে কোনও যুক্তি পেতে পারে। কনস্ট্রাক্টরকে কল করার পরে বাহ্যিক কোডটি কী হয়।ClassDefinition
Constructor
Constructor
Interface
var ClassX = (function ClassDefinition () {
var Constructor = function Constructor (valA) {
return Interface(this, ClassValues({ valA: valA }), "ClassX");
};
Constructor.prototype.getValA = function getValA() {
//private value access pattern to get current value.
return this._$("valA");
};
Constructor.prototype.setValA = function setValA(valA) {
//private value access pattern to set new value.
this._$("valA", valA);
};
Constructor.prototype.isValAValid = function isValAValid(validMessage, invalidMessage) {
//interface access pattern to call object function.
var valA = this.$("getValA");
//timesAccessed was not defined in constructor but can be added later...
var timesAccessed = this._$("timesAccessed");
if (timesAccessed) {
timesAccessed = timesAccessed + 1;
} else {
timesAccessed = 1;
}
this._$("timesAccessed", timesAccessed);
if (valA) {
return "valA is " + validMessage + ".";
}
return "valA is " + invalidMessage + ".";
};
return Constructor;
}());
প্রোটোটাইপযুক্ত ফাংশনগুলিতে থাকার কোনও মানে নেই Constructor
, যদিও আপনি এগুলি কনস্ট্রাক্টর ফাংশন বডিতে সংজ্ঞায়িত করতে পারেন। সমস্ত ফাংশন জনসাধারণের ডলার প্যাটার্ন দিয়ে ডাকা হয় this.$("functionName"[, param1[, param2 ...]])
। ব্যক্তিগত মানগুলি ব্যক্তিগত ডলার প্যাটার্ন দ্বারা অ্যাক্সেস করা হয় this._$("valueName"[, replacingValue]);
। যেমনটির Interface
সংজ্ঞা নেই _$
, মানগুলি বাহ্যিক বস্তু দ্বারা অ্যাক্সেস করা যায় না। যেহেতু প্রতিটি প্রোটোটাইপড ফাংশন বডি ফাংশনে অবজেক্টে this
সেট করা values
থাকে $
, আপনি যদি কনস্ট্রাক্টর ভাইবাল ফাংশনগুলি সরাসরি কল করেন তবে আপনি ব্যতিক্রম পাবেন; : _ $ / $ প্যাটার্ন চাহিদা prototyped ফাংশন লাশ খুব অনুসরণ করা। নমুনা ব্যবহার নীচে।
var classX1 = new ClassX();
console.log("classX1." + classX1.$("isValAValid", "valid", "invalid"));
console.log("classX1.valA: " + classX1.$("getValA"));
classX1.$("setValA", "v1");
console.log("classX1." + classX1.$("isValAValid", "valid", "invalid"));
var classX2 = new ClassX("v2");
console.log("classX1.valA: " + classX1.$("getValA"));
console.log("classX2.valA: " + classX2.$("getValA"));
//This will throw an exception
//classX1._$("valA");
এবং কনসোল আউটপুট।
classX1.valA is invalid.
classX1.valA: undefined
classX1.valA is valid.
classX1.valA: v1
classX2.valA: v2
: _ $ / $ প্যাটার্ন সম্পূর্ণরূপে prototyped ক্লাসের মূল্যবোধের পূর্ণ গোপনীয়তা পারেন। আমি কখনই এটি ব্যবহার করব কিনা তা আমি জানি না, তবে এর ত্রুটিগুলিও রয়েছে, তবে ওহে, এটি একটি ভাল ধাঁধা ছিল!