আমি জাভাস্ক্রিপ্ট দিয়ে কীভাবে ওওপি তৈরি করব তা শিখছি । এটির কি ইন্টারফেস ধারণা (যেমন জাভা interface
) রয়েছে?
সুতরাং আমি শ্রোতা তৈরি করতে সক্ষম হব ...
আমি জাভাস্ক্রিপ্ট দিয়ে কীভাবে ওওপি তৈরি করব তা শিখছি । এটির কি ইন্টারফেস ধারণা (যেমন জাভা interface
) রয়েছে?
সুতরাং আমি শ্রোতা তৈরি করতে সক্ষম হব ...
উত্তর:
"এই শ্রেণীর এই ফাংশনগুলি অবশ্যই থাকতে হবে" এর কোনও ধারণা নেই (এটি প্রতি সেফের জন্য কোনও ইন্টারফেস নয়), কারণ:
পরিবর্তে, জাভাস্ক্রিপ্ট ডক টাইপিং যাকে বলে ব্যবহার করে । (যদি এটি হাঁসের মতো হাঁটতে থাকে এবং হাঁসের মতো কোঁক দেয়, জেএস যতটা যত্নশীল, এটি একটি হাঁস।) যদি আপনার অবজেক্টের কোয়াক (), হাঁটা () এবং ফ্লাই () পদ্ধতি থাকে তবে কোডটি যেখানে আশা করবে সেখানে এটি ব্যবহার করতে পারে এমন কোনও বস্তু যা কিছু "ডাকযোগ্য" ইন্টারফেস প্রয়োগের প্রয়োজন ছাড়াই হাঁটতে, কোঁকতে এবং উড়তে পারে। ইন্টারফেসটি হ'ল কোডটি যে ফাংশনগুলির সেট করে (এবং সেই ফাংশনগুলি থেকে ফেরতের মানগুলি) এবং হাঁসের টাইপিংয়ের সাথে আপনি এটি নিখরচায় পাবেন।
এখন, এটি বলার অপেক্ষা রাখে না যে আপনি কোড দেওয়ার চেষ্টা করলে আপনার কোডটি অর্ধেক পেরিয়ে যাবে না some_dog.quack()
; আপনি একটি টাইপরর পাবেন। সত্যই, যদি আপনি কুকুরকে কোমল করতে বলছেন তবে আপনার কিছুটা বড় সমস্যা রয়েছে; আপনি আপনার সমস্ত হাঁসকে একটানা রাখলে হাঁসের টাইপিং সবচেয়ে ভাল কাজ করে, তাই বলার জন্য এবং কুকুর এবং হাঁসকে একত্রে মিশ্রিত করতে দিচ্ছেন না যদি আপনি তাদের সাথে জেনেরিক প্রাণী হিসাবে ব্যবহার না করেন। অন্য কথায়, ইন্টারফেসটি তরল হলেও এটি এখনও রয়েছে; কোডটিতে কোনও কুকুরকে পাস করার ক্ষেত্রে এটি প্রায়শই ত্রুটি হয় যা এটি প্রথম স্থানটিতে উড়ে বেড়াতে এবং উড়ে যাওয়ার আশা করে।
তবে আপনি যদি নিশ্চিত হন যে আপনি সঠিক কাজটি করছেন তবে আপনি কোয়াকিং-কুকুর সমস্যাটি ব্যবহার করার চেষ্টা করার আগে কোনও নির্দিষ্ট পদ্ধতির অস্তিত্বের জন্য পরীক্ষা করে কাজ করতে পারেন। কিছুটা এইরকম
if (typeof(someObject.quack) == "function")
{
// This thing can quack
}
সুতরাং আপনি যে সমস্ত পদ্ধতি ব্যবহার করতে পারেন সেগুলি ব্যবহারের আগে আপনি যাচাই করতে পারেন। যদিও সিনট্যাক্সটি এক রকম কুৎসিত। কিছুটা সুন্দর উপায় আছে:
Object.prototype.can = function(methodName)
{
return ((typeof this[methodName]) == "function");
};
if (someObject.can("quack"))
{
someObject.quack();
}
এটি স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট, সুতরাং এটি ব্যবহার করার মতো কোনও জেএস ইন্টারপ্রেটারে কাজ করা উচিত। এটির মতো ইংরেজি পড়ার অতিরিক্ত সুবিধা রয়েছে।
আধুনিক ব্রাউজারগুলির জন্য (এটি, আইআই 6-8 ব্যতীত অন্য কোনও ব্রাউজার), সম্পত্তিটি প্রদর্শিত না হতে পারে এমন উপায়ও রয়েছে for...in
:
Object.defineProperty(Object.prototype, 'can', {
enumerable: false,
value: function(method) {
return (typeof this[method] === 'function');
}
}
সমস্যাটি হ'ল আই 7 আইটেমগুলির মোটেও নেই .defineProperty
এবং আই 8 তে এটি অভিযোগ করা হয়েছে কেবল হোস্ট অবজেক্টগুলিতে (এটি, ডোম উপাদান এবং এ জাতীয়)। সামঞ্জস্যতা যদি কোনও সমস্যা হয় তবে আপনি ব্যবহার করতে পারবেন না .defineProperty
। (আমি আই আই mention এর উল্লেখও করব না, কারণ এটি চীন এর বাইরে আর অপ্রাসঙ্গিক)
আর একটি সমস্যা হ'ল কিছু কোডিং শৈলীর ধারণা ধরে নেওয়া পছন্দ করে যে প্রত্যেকে খারাপ কোড লিখেছেন এবং Object.prototype
কেউ অন্ধভাবে ব্যবহার করতে চান এমন ক্ষেত্রে সংশোধন করতে নিষেধ করেছেন for...in
। আপনি যদি সে সম্পর্কে যত্নশীল হন বা (আইএমও ভাঙ্গা ) কোড ব্যবহার করছেন যা কিছুটা আলাদা সংস্করণ ব্যবহার করে দেখুন:
function can(obj, methodName)
{
return ((typeof obj[methodName]) == "function");
}
if (can(someObject, "quack"))
{
someObject.quack();
}
for...in
হ'ল - এবং সর্বদা - এই জাতীয় বিপদগুলির সাথে পরিপূর্ণ এবং যে কেউ এটি অন্তত বিবেচনা না করেই এটি করে যে কেউ Object.prototype
( যে কোনও অনুপযুক্ত কৌশল নয়, সেই নিবন্ধটির নিজস্ব ভর্তি দিয়ে) অন্য কারও হাতে তাদের কোড বিরতি দেখতে পাবে।
for...in
সমস্যা এড়াতে পারেন । বিকাশকারী.মোজিলা.আর.ইন-
for...in
সমস্যা" এখনও কিছুটা অবধি থাকবে, কারণ সেখানে সর্বদা opিপি কোড থাকবে ... ভাল, এটি, এবং Object.defineProperty(obj, 'a', {writable: true, enumerable: false, value: 3});
এটি কেবল বিচারের চেয়ে কিছুটা বেশি কাজ obj.a = 3;
। লোকেরা এটি প্রায়শই বুঝতে পারে যে এটি প্রায়শই না করার চেষ্টা করে। : পি
ডাস্টিন ডিয়াজের ' জাভাস্ক্রিপ্ট ডিজাইনের ধরণগুলির ' একটি অনুলিপি নিন । হাঁসের টাইপিংয়ের মাধ্যমে জাভাস্ক্রিপ্ট ইন্টারফেস প্রয়োগের জন্য উত্সর্গীকৃত কয়েকটি অধ্যায় রয়েছে। এটি পাশাপাশি একটি দুর্দান্ত পড়া। তবে না, কোনও ইন্টারফেসের কোনও ভাষা নেটিভ বাস্তবায়ন নেই, আপনাকে হাঁসের প্রকার করতে হবে ।
// example duck typing method
var hasMethods = function(obj /*, method list as strings */){
var i = 1, methodName;
while((methodName = arguments[i++])){
if(typeof obj[methodName] != 'function') {
return false;
}
}
return true;
}
// in your code
if(hasMethods(obj, 'quak', 'flapWings','waggle')) {
// IT'S A DUCK, do your duck thang
}
জাভাস্ক্রিপ্ট (ECMAScript সংস্করণ 3) এর ভবিষ্যতের ব্যবহারের জন্যimplements
সংরক্ষিত শব্দ রয়েছে । আমি মনে করি এটি ঠিক এই উদ্দেশ্যেই করা হয়েছিল, তবে দরজার বাইরে স্পেসিফিকেশনটি পাওয়ার জন্য তাড়াহুড়ো করে তাদের সাথে কী করা উচিত তা সংজ্ঞায়নের জন্য তাদের কাছে সময় ছিল না, সুতরাং বর্তমান সময়ে ব্রাউজারগুলি ছাড়াও কিছু করে না যদি আপনি এটি কোনও কিছুর জন্য ব্যবহার করার চেষ্টা করেন তবে এটি সেখানে বসুন এবং মাঝে মাঝে অভিযোগ করুন।
Object.implement(Interface)
যুক্তি দিয়ে আপনার নিজস্ব পদ্ধতি তৈরি করা সম্ভব এবং সত্যই যথেষ্ট সহজ যে বাউলগুলি যখনই কোনও নির্দিষ্ট সংস্থার / ফাংশনগুলির একটি সেট কোনও নির্দিষ্ট বস্তুর মধ্যে প্রয়োগ না করে।
আমি অবজেক্ট-ওরিয়েন্টেশন সম্পর্কিত একটি নিবন্ধ লিখেছি যেখানে নীচে আমার নিজস্ব স্বরলিপি ব্যবহার করুন :
// Create a 'Dog' class that inherits from 'Animal'
// and implements the 'Mammal' interface
var Dog = Object.extend(Animal, {
constructor: function(name) {
Dog.superClass.call(this, name);
},
bark: function() {
alert('woof');
}
}).implement(Mammal);
এই নির্দিষ্ট বিড়ালটিকে ত্বকে নেওয়ার বিভিন্ন উপায় রয়েছে তবে আমি নিজের ইন্টারফেস প্রয়োগের জন্য এই যুক্তিটি ব্যবহার করেছি। আমি দেখতে পাই যে আমি এই পদ্ধতির পছন্দ করি এবং এটি পড়তে এবং ব্যবহার করা সহজ (যেমন আপনি উপরে দেখতে পারেন)। এর অর্থ হল একটি 'প্রয়োগ' পদ্ধতি যুক্ত করা Function.prototype
যার সাথে কিছু লোকের সমস্যা হতে পারে তবে আমি এটি সুন্দরভাবে কাজ করে দেখছি।
Function.prototype.implement = function() {
// Loop through each interface passed in and then check
// that its members are implemented in the context object (this).
for(var i = 0; i < arguments.length; i++) {
// .. Check member's logic ..
}
// Remember to return the class being tested
return this;
}
var interf = arguments[i]; for (prop in interf) { if (this.prototype[prop] === undefined) { throw 'Member [' + prop + '] missing from class definition.'; }}
। আরও বিস্তৃত উদাহরণের জন্য নিবন্ধের নীচের অংশটি দেখুন।
যদিও জাভাস্ক্রিপ্টে টাইপ না থাকলেও interface
প্রায়শই এটি প্রয়োজন হয়। জাভাস্ক্রিপ্টের গতিশীল প্রকৃতি এবং প্রোটোটাইপিকাল-হেরিরিটেন্সের ব্যবহার সম্পর্কিত কারণগুলির জন্য, ক্লাসে অবিচ্ছিন্ন ইন্টারফেসগুলি নিশ্চিত করা কঠিন - তবে এটি করা সম্ভব; এবং ঘন ঘন অনুকরণ।
এই মুহুর্তে, জাভাস্ক্রিপ্টে ইন্টারফেসগুলি অনুকরণ করার জন্য বেশ কয়েকটি বিশেষ উপায় রয়েছে; পদ্ধতির উপর বৈকল্পিকতা সাধারণত কিছু চাহিদা পূরণ করে, অন্যরা আবদ্ধ থাকে না। প্রায়শই, সর্বাধিক শক্তিশালী পন্থা অত্যধিক জটিল এবং স্টিমিমিগুলি প্রয়োগকারী (বিকাশকারী) হয়।
এখানে ইন্টারফেস / অ্যাবস্ট্রাক্ট ক্লাসগুলির একটি পদ্ধতি যা খুব জটিল নয়, তা স্পষ্টতই বোঝা যায়, অ্যাবস্ট্রাকশনের অভ্যন্তরীণ প্রয়োগকে ন্যূনতম স্থানে রাখে এবং গতিশীল বা কাস্টম পদ্ধতিগুলির জন্য যথেষ্ট জায়গা ছেড়ে দেয়:
function resolvePrecept(interfaceName) {
var interfaceName = interfaceName;
return function curry(value) {
/* throw new Error(interfaceName + ' requires an implementation for ...'); */
console.warn('%s requires an implementation for ...', interfaceName);
return value;
};
}
var iAbstractClass = function AbstractClass() {
var defaultTo = resolvePrecept('iAbstractClass');
this.datum1 = this.datum1 || defaultTo(new Number());
this.datum2 = this.datum2 || defaultTo(new String());
this.method1 = this.method1 || defaultTo(new Function('return new Boolean();'));
this.method2 = this.method2 || defaultTo(new Function('return new Object();'));
};
var ConcreteImplementation = function ConcreteImplementation() {
this.datum1 = 1;
this.datum2 = 'str';
this.method1 = function method1() {
return true;
};
this.method2 = function method2() {
return {};
};
//Applies Interface (Implement iAbstractClass Interface)
iAbstractClass.apply(this); // .call / .apply after precept definitions
};
প্রিসেপ্ট রেজোলভার
resolvePrecept
ফাংশন আপনার ভেতরে ব্যবহার করার জন্য একটি ইউটিলিটি & সাহায্যকারী ফাংশন সারাংশ ক্লাস । এর কাজটি হ'ল এনক্যাপসুলেটেড প্রিসিপ্টগুলি (ডেটা এবং আচরণ) কাস্টমাইজড প্রয়োগকরণ-পরিচালনা করার অনুমতি দেওয়া । এটি ত্রুটি ছুঁড়ে দিতে পারে বা সতর্ক করতে পারে - এবং - প্রয়োগকারী শ্রেণিতে একটি ডিফল্ট মান নির্ধারণ করে।
iAbstractClass
iAbstractClass
ইন্টারফেস ব্যবহার করা সংজ্ঞায়িত করে। এর পদ্ধতির প্রয়োগকারী শ্রেণীর সাথে স্বতন্ত্র চুক্তি রয়েছে। এই ইন্টারফেসটি প্রতিটি প্রসেপ্টকে একই নির্ভুল প্রসেপ্ট নেমস্পেসে অর্পণ করে - বা - প্রিসেপ্ট রিসলভার ফাংশনটি যাই হোক না কেন দেয়। যাইহোক, স্পষ্ট চুক্তি একটি প্রসঙ্গে সমাধান করে - প্রবর্তকের বিধান।
প্রয়োগ
প্রয়োগ কেবল (একটি ইন্টারফেস সঙ্গে 'একমত' iAbstractClass এই ক্ষেত্রে) এবং ব্যবহার দ্বারা তা প্রযোজ্য রচয়িতা-ছিনতাই : iAbstractClass.apply(this)
। উপরের ডেটা এবং আচরণটি সংজ্ঞায়িত করে এবং তারপরে ইন্টারফেসের নির্মাণকারীকে হাইজ্যাক করে - ইন্টারফেস কনস্ট্রাক্টরের কাছে প্রয়োগকারীের প্রসঙ্গটি প্রেরণ করে - আমরা নিশ্চিত করতে পারি যে ইমপ্লিমেন্টরের ওভাররাইডগুলি যুক্ত করা হবে, এবং সেই ইন্টারফেস সতর্কতা এবং ডিফল্ট মানগুলি প্রকাশ করবে।
এটি একটি খুব অ-জটিল সমস্যা যা আমার দলকে পরিবেশন করেছে এবং সময় এবং বিভিন্ন প্রকল্পের জন্য আমি খুব ভাল। তবে এর কিছুটা সতর্কতা ও ঘাটতি রয়েছে।
অপূর্ণতা
যদিও এটি আপনার সফ্টওয়্যার জুড়ে একটি উল্লেখযোগ্য মাত্রায় ধারাবাহিকতা প্রয়োগ করতে সহায়তা করে, এটি সত্য ইন্টারফেস প্রয়োগ করে না - তবে সেগুলি অনুকরণ করে। সংজ্ঞা, অক্ষমতা, এবং সতর্কবার্তা বা ত্রুটি যদিও হয় explicated, ব্যবহারের ব্যাখ্যা করা হয় জারি & জাহির ডেভেলপার দ্বারা (জাভাস্ক্রিপ্ট উন্নয়নের অনেক সঙ্গে হিসাবে)।
এটি "জাভাস্ক্রিপ্টের ইন্টারফেসগুলিতে" আপাতদৃষ্টিতে সেরা পন্থা , তবে আমি নীচের সমাধানটি দেখতে পছন্দ করব:
delete
ক্রিয়াগুলি থেকে অবজেক্টগুলিকে স্থির করুনএটি বলেছিল, আমি আশা করি এটি আমার দল এবং আমি যেমন আছে ততটাই আপনাকে সহায়তা করবে hope
আপনার জাভাতে ইন্টারফেস প্রয়োজন কারণ এটি স্থিতিযুক্ত টাইপ করা হয় এবং সংকলনের সময় ক্লাসগুলির মধ্যে চুক্তিটি জানা উচিত। জাভাস্ক্রিপ্টে এটি আলাদা। জাভাস্ক্রিপ্ট গতিশীল টাইপ করা হয়; এর অর্থ হ'ল আপনি যখন বস্তুটি পেয়েছেন তখন কেবল এটির কোনও নির্দিষ্ট পদ্ধতি আছে কিনা তা পরীক্ষা করে কল করতে পারেন।
yourMethod
না Superclass
l সংযোগ করার সময়, এটি এর ভিটিবেলে # 5 এ প্রবেশ করতে পারে এবং প্রতিটি সাবক্লাসের নিজস্ব নিজস্ব রয়েছে yourMethod
, কেবল যে সাবক্লাসের প্রবেশিকা # 5 নির্দেশ করে উপযুক্ত বাস্তবায়নে
Implementation
প্রয়োগ করা একটি শ্রেণি SomeInterface
কেবল এটি বলে না যে এটি পুরো ইন্টারফেসটি প্রয়োগ করে। এটিতে এমন তথ্য রয়েছে যা "আমি প্রয়োগ করি SomeInterface.yourMethod
" বলে এবং পদ্ধতির সংজ্ঞাটিতে নির্দেশ করে Implementation.yourMethod
। যখন জেভিএম কল করে SomeInterface.yourMethod
, তখন সেই ইন্টারফেসের পদ্ধতির বাস্তবায়ন সম্পর্কে তথ্যের জন্য এটি শ্রেণিতে দেখায় এবং এটির কল করার দরকার পড়ে Implementation.yourMethod
।
আশা করি, যে কেউ এখনও উত্তর খুঁজছেন সে এটি সহায়ক বলে মনে করে।
আপনি একটি প্রক্সি ব্যবহার করে দেখতে পারেন (এটি ECMAScript 2015 সালের পরে স্ট্যান্ডার্ড): https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Proxy
latLngLiteral = new Proxy({},{
set: function(obj, prop, val) {
//only these two properties can be set
if(['lng','lat'].indexOf(prop) == -1) {
throw new ReferenceError('Key must be "lat" or "lng"!');
}
//the dec format only accepts numbers
if(typeof val !== 'number') {
throw new TypeError('Value must be numeric');
}
//latitude is in range between 0 and 90
if(prop == 'lat' && !(0 < val && val < 90)) {
throw new RangeError('Position is out of range!');
}
//longitude is in range between 0 and 180
else if(prop == 'lng' && !(0 < val && val < 180)) {
throw new RangeError('Position is out of range!');
}
obj[prop] = val;
return true;
}
});
তারপরে আপনি সহজেই বলতে পারেন:
myMap = {}
myMap.position = latLngLiteral;
আপনি যখন ট্রান্সকোম্পিলার ব্যবহার করতে চান, তখন আপনি টাইপস্ক্রিপ্ট একবার চেষ্টা করে দেখতে পারেন। এটি খসড়া ইসিএমএ বৈশিষ্ট্যগুলিকে সমর্থন করে (প্রস্তাবনায় ইন্টারফেসগুলিকে " প্রোটোকল " বলা হয় ) যা কফিস্ক্রিপ্ট বা বাবেলের মতো ভাষার মতো করে do
টাইপসক্রিপ্টটিতে আপনার ইন্টারফেসটি দেখতে দেখতে দেখতে পারে:
interface IMyInterface {
id: number; // TypeScript types are lowercase
name: string;
callback: (key: string; value: any; array: string[]) => void;
type: "test" | "notATest"; // so called "union type"
}
আপনি যা করতে পারবেন না:
জাভাস্ক্রিপ্টে কোনও নেটিভ ইন্টারফেস নেই, ইন্টারফেস অনুকরণ করার বিভিন্ন উপায় রয়েছে। আমি এটি একটি প্যাকেজ লিখেছি
আপনি এখানে প্রতিস্থাপন দেখতে পারেন
জাভাস্ক্রিপ্টের ইন্টারফেস নেই। তবে এটি হাঁসের মতো টাইপ করা যেতে পারে, একটি উদাহরণ এখানে পাওয়া যাবে:
http://reinsbrain.blogspot.com/2008/10/interface-in-javascript.html
আমি জানি এটি একটি পুরানো, তবে আমি সম্প্রতি আমার নিজের ইন্টারফেসের বিরুদ্ধে আইটেমগুলি যাচাই করার জন্য একটি সহজ এপিআই লাগানোর জন্য নিজেকে আরও বেশি বেশি প্রয়োজন বলে মনে করেছি। সুতরাং আমি এটি লিখেছি: https://github.com / টমহিক্স / thodতিহ্যগত
এটি এনপিএম এর মাধ্যমেও পাওয়া যায়: npm install methodical
এটি মূলত উপরে প্রস্তাবিত সমস্ত কিছু করে, কিছুটা আরও কঠোর হওয়ার জন্য কিছু বিকল্প সহ এবং সমস্ত কিছু if (typeof x.method === 'function')
বয়লারপ্লেট না করেই করা হয় ।
আশা করি কেউ এটি কাজে লাগবে।
এটি একটি পুরানো প্রশ্ন, তবুও এই বিষয়টি আমাকে কখনই থামিয়ে দেয় না।
এখানে এবং ওয়েব জুড়ে অনেকগুলি উত্তর ইন্টারফেসকে "প্রয়োগ" করার দিকে দৃষ্টি নিবদ্ধ করে, আমি একটি বিকল্প দর্শন প্রস্তাব করতে চাই:
আমি ইন্টারফেসের অভাব সবচেয়ে বেশি অনুভব করি যখন আমি একাধিক ক্লাস ব্যবহার করি যা একইভাবে আচরণ করে (যেমন একটি ইন্টারফেস প্রয়োগ করে )।
উদাহরণস্বরূপ, আমার কাছে একটি ইমেল জেনারেটর রয়েছে যা ইমেল সেকশন ফ্যাক্টরিগুলি পাওয়ার প্রত্যাশা করে , যা বিভাগগুলির সামগ্রী এবং এইচটিএমএল জেনারেট করতে "জানেন"। সুতরাং, তাদের সকলের কিছু না কিছু পদ্ধতি getContent(id)
এবং getHtml(content)
পদ্ধতি থাকা দরকার।
ইন্টারফেসের নিকটতম প্যাটার্ন (যদিও এটি এখনও কার্যকর নয়) আমি এমন একটি শ্রেণি ব্যবহার করছি যা 2 টি আর্গুমেন্ট পাবে যা 2 ইন্টারফেসের পদ্ধতিগুলি সংজ্ঞায়িত করবে।
এই প্যাটার্নটির সাথে প্রধান চ্যালেঞ্জটি হ'ল static
এর বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য পদ্ধতিগুলি হয় হয় বা দৃষ্টান্ত হিসাবে নিজেকে যুক্তি হিসাবে পেতে হয়। তবে এমন কেস রয়েছে যাতে আমি এই বাণিজ্যটি ঝামেলার পক্ষে মূল্যবান বলে মনে করি।
class Filterable {
constructor(data, { filter, toString }) {
this.data = data;
this.filter = filter;
this.toString = toString;
// You can also enforce here an Iterable interface, for example,
// which feels much more natural than having an external check
}
}
const evenNumbersList = new Filterable(
[1, 2, 3, 4, 5, 6], {
filter: (lst) => {
const evenElements = lst.data.filter(x => x % 2 === 0);
lst.data = evenElements;
},
toString: lst => `< ${lst.data.toString()} >`,
}
);
console.log('The whole list: ', evenNumbersList.toString(evenNumbersList));
evenNumbersList.filter(evenNumbersList);
console.log('The filtered list: ', evenNumbersList.toString(evenNumbersList));
বিমূর্ত ইন্টারফেস এর মত
const MyInterface = {
serialize: () => {throw "must implement serialize for MyInterface types"},
print: () => console.log(this.serialize())
}
একটি উদাহরণ তৈরি করুন:
function MyType() {
this.serialize = () => "serialized "
}
MyType.prototype = MyInterface
এবং এটি ব্যবহার করুন
let x = new MyType()
x.print()