আমি বেশ কয়েকটি নোড.জেএস লাইব্রেরিতে এই প্যাটার্নটি দেখছি:
Master.prototype.__proto__ = EventEmitter.prototype;
(উত্স এখানে )
কেউ দয়া করে আমাকে একটি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন, কেন এটি এত সাধারণ প্যাটার্ন এবং এটি কার্যকর যখন?
আমি বেশ কয়েকটি নোড.জেএস লাইব্রেরিতে এই প্যাটার্নটি দেখছি:
Master.prototype.__proto__ = EventEmitter.prototype;
(উত্স এখানে )
কেউ দয়া করে আমাকে একটি উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন, কেন এটি এত সাধারণ প্যাটার্ন এবং এটি কার্যকর যখন?
__proto__
একটি অ্যান্টি-প্যাটার্ন, দয়া করে ব্যবহার করুনMaster.prototype = Object.create(EventEmitter.prototype);
util.inherits(Master, EventEmitter);
উত্তর:
কোডটির উপরের মতামতটি যেমন বলেছে, এটি Master
উত্তরাধিকার সূত্রে প্রাপ্ত হবে EventEmitter.prototype
, সুতরাং আপনি ইভেন্টটি নির্গত করতে এবং শুনতে এই 'শ্রেণীর' উদাহরণ ব্যবহার করতে পারেন।
উদাহরণস্বরূপ আপনি এখন এটি করতে পারেন:
masterInstance = new Master();
masterInstance.on('an_event', function () {
console.log('an event has happened');
});
// trigger the event
masterInstance.emit('an_event');
আপডেট : যতগুলি ব্যবহারকারী চিহ্নিত করেছেন, নোডে এটি করার 'মানক' উপায়টি হ'ল 'ইউট.ইন.ইরিটিস' ব্যবহার করা হবে:
var EventEmitter = require('events').EventEmitter;
util.inherits(Master, EventEmitter);
২ য় আপডেট : ES6 ক্লাস নিয়ে আমাদের উপর, EventEmitter
এখন ক্লাসটি বাড়ানোর পরামর্শ দেওয়া হচ্ছে :
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
require('events').EventEmitter
প্রথম করতে আমি সবসময় ভুলবেন এখানে কেস অন্য কেউ এটা চাহিদা মধ্যে ডক্সে লিঙ্ক। nodejs.org/api/events.html#events_class_events_eventemitter )
MasterInstance
উচিত , তাই হওয়া উচিত masterInstance
।
Master.prototype = EventEmitter.prototype;
। সুপারের দরকার নেই। আপনি ES6 এক্সটেন্ডসগুলি (এবং এটি নোড.জেএস ডক্সে উত্সাহিত করা util.inherits
) এর মতো ব্যবহার class Master extends EventEmitter
করতে পারেন - আপনি ক্লাসিকাল হন super()
তবে কোনও কিছুতে ইনজেকশন না দিয়ে Master
।
নোড ডকস এখন আপনার নিজের ইভেন্ট প্রেরক তৈরির জন্য শ্রেণি উত্তরাধিকার ব্যবহারের পরামর্শ দেয় :
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
// Add any custom methods here
}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
দ্রষ্টব্য: আপনি যদি কোনও constructor()
ফাংশনটি সংজ্ঞায়িত করেন তবে পিতা-মাতার শ্রেণীর নির্মাতাটিকেও MyEmitter
ডাকা super()
হবে তা নিশ্চিত করার জন্য আপনাকে এটিকে কল করা উচিত , যদি না আপনি যদি না চান তবে ভাল কারণ নেই।
super()
হয় প্রয়োজন নেই , যতদিন আপনি প্রয়োজন নেই যেমন / একটি কন্সট্রাকটর নির্ধারণ করুন, অত: পর Breedly মূল উত্তর (সম্পাদনা ইতিহাস দেখুন) সম্পূর্ণভাবে সঠিক ছিল। এই ক্ষেত্রে আপনি এই একই উদাহরণটিকে অনুলিপিতে অনুলিপি করতে এবং কাস্ট করতে পারেন, নির্মাতাকে পুরোপুরি সরান এবং এটি একইভাবে কাজ করবে। এটি পুরোপুরি বৈধ সিনট্যাক্স।
অন্য জাভাস্ক্রিপ্ট অবজেক্ট থেকে উত্তরাধিকারী হওয়ার জন্য, বিশেষত নোড.জেসের ইভেন্টইমিটার তবে সাধারণভাবে কোনও বস্তু, আপনার দুটি জিনিস করতে হবে:
[[proto]]
আপনার কনস্ট্রাক্টর থেকে তৈরি বস্তুর জন্য ব্যবহৃত হবে ; আপনি অন্য কোনও অবজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ক্ষেত্রে আপনি সম্ভবত অন্য বিষয়টির উদাহরণটি আপনার প্রোটোটাইপ হিসাবে ব্যবহার করতে চান।এটি জাভাস্ক্রিপ্টে আরও জটিল কারণ এটি অন্য ভাষাগুলির চেয়ে বেশি বলে মনে হচ্ছে কারণ
নোড.জেএস এর ইভেন্টইমিটারের নির্দিষ্ট কেসের জন্য, এখানে কী কাজ করে তা এখানে:
var EventEmitter = require('events').EventEmitter;
var util = require('util');
// Define the constructor for your derived "class"
function Master(arg1, arg2) {
// call the super constructor to initialize `this`
EventEmitter.call(this);
// your own initialization of `this` follows here
};
// Declare that your class should use EventEmitter as its prototype.
// This is roughly equivalent to: Master.prototype = Object.create(EventEmitter.prototype)
util.inherits(Master, EventEmitter);
সম্ভাব্য ফেবিল:
util.inherits
তবে EventEmitter
আপনার শ্রেণীর উদাহরণের জন্য সুপার কনস্ট্রাক্টরকে ( ) কল করবেন না , সেগুলি সঠিকভাবে আরম্ভ করা হবে না।new EventEmitter
হিসাবে) Master.prototype
পরিবর্তে উপশ্রেণী কন্সট্রাকটর থাকার Master
সুপার কন্সট্রাকটর কল EventEmitter
; সুপারক্লাস নির্মাণকারীর আচরণের উপর নির্ভর করে যা মনে হতে পারে এটি কিছুক্ষণ ঠিকঠাক কাজ করছে তবে একই জিনিস নয় (এবং ইভেন্টেমিটারের জন্য কাজ করবে না)।Master.prototype = EventEmitter.prototype
অবজেক্ট.ক্রিয়েটের মাধ্যমে অবজেক্টের অতিরিক্ত স্তর যুক্ত করার পরিবর্তে সরাসরি সুপার প্রোটোটাইপ ব্যবহার করার চেষ্টা করতে পারেন ; এটি মনে হচ্ছে এটি ঠিকঠাক কাজ করছে যতক্ষণ না কেউ আপনার বস্তুকে Master
বানকিপ্যাচ করে EventEmitter
এবং অজান্তে বাঁদিক এবং তার সমস্ত বংশধরদেরও না করে। প্রতিটি "শ্রেণি" এর নিজস্ব প্রোটোটাইপ থাকা উচিত।আবার: ইভেন্টইমিটার (বা সত্যিকারের কোনও বিদ্যমান বস্তু "শ্রেণি") থেকে উত্তরাধিকারী হওয়ার জন্য, আপনি এমন একটি নির্মাতার সংজ্ঞা দিতে চান যা সুপার কনস্ট্রাক্টরকে চেইন করে এবং একটি প্রোটোটাইপ সরবরাহ করে যা সুপার প্রোটোটাইপ থেকে প্রাপ্ত।
এইভাবে জাভাস্ক্রিপ্টে প্রোটোটাইপিকাল (প্রোটোটাইপাল?) উত্তরাধিকার সম্পন্ন হয়। এমডিএন থেকে :
অবজেক্টের প্রোটোটাইপ বোঝায়, যা কোনও বস্তু বা নাল হতে পারে (যার অর্থ সাধারণত অবজেক্টটি অবজেক্ট.প্রোটোটাইপ, যার কোনও প্রোটোটাইপ নেই)। এটি কখনও কখনও প্রোটোটাইপ-উত্তরাধিকার ভিত্তিক সম্পত্তি অনুসন্ধানগুলি প্রয়োগ করতে ব্যবহৃত হয়।
এটি পাশাপাশি কাজ করে:
var Emitter = function(obj) {
this.obj = obj;
}
// DON'T Emitter.prototype = new require('events').EventEmitter();
Emitter.prototype = Object.create(require('events').EventEmitter.prototype);
জাভা স্ক্রিপ্ট বোঝা ওওপি ECMAScript 5-তে আমি ওপিতে ইদানীং পড়ি এমন সেরা নিবন্ধগুলির মধ্যে একটি।
Y.prototype = new X();
একটি অ্যান্টি-প্যাটার্ন, দয়া করে ব্যবহার করুনY.prototype = Object.create(X.prototype);
new X()
একটি দৃষ্টান্ত ইনস্ট্যান্টিয়েট করুন X.prototype
এবং এটিতে অনুরোধ করে এটি সূচনা X
করুন। Object.create(X.prototype)
কেবল একটি উদাহরণ ইনস্ট্যান্ট করে তোলে। আপনি Emitter.prototype
আরম্ভ করতে চান না । আমি এটির একটি ভাল নিবন্ধ খুঁজে পাই না।
আমি ভেবেছিলাম http://www.bennadel.com/blog/2187- এক্সটেন্ডিং- ইভেন্টএমিটার- টো- ক্রিয়েট- অ্যাভেনডেড- ক্যাশে-ইন- নোড- জেএসএসটিএম থেকে এই পদ্ধতিটি বেশ ঝরঝরে ছিল:
function EventedObject(){
// Super constructor
EventEmitter.call( this );
return( this );
}
ডগলাস ক্রকফোর্ডেরও কিছু আকর্ষণীয় উত্তরাধিকারের নিদর্শন রয়েছে: http://www.crockford.com/javascript/inheritance.html
আমি খুঁজে পেয়েছি জাভাস্ক্রিপ্ট এবং নোড.জেএস এ উত্তরাধিকারের কম প্রয়োজন হয়। তবে একটি অ্যাপ্লিকেশন লেখার ক্ষেত্রে যেখানে উত্তরাধিকার স্কেলেবিলিটিতে প্রভাব ফেলতে পারে, আমি রক্ষণাবেক্ষণের বিরুদ্ধে কর্মক্ষমতা ওজন বিবেচনা করব। অন্যথায়, আমি কেবলমাত্র আমার সিদ্ধান্তটিকে ভিত্তি করব যার ভিত্তিতে নিদর্শনগুলি আরও ভাল সামগ্রিক নকশাগুলির দিকে পরিচালিত করে, আরও রক্ষণাবেক্ষণযোগ্য এবং কম ত্রুটি-প্রবণ one
মোটামুটি তুলনা পেতে গুগল ক্রোম (ভি 8) ব্যবহার করে জেএসফুরে বিভিন্ন নিদর্শনগুলি পরীক্ষা করুন। ভি 8 হ'ল জাভাস্ক্রিপ্ট ইঞ্জিন যা নোড.জেএস এবং ক্রোম উভয়ই ব্যবহার করে।
আপনাকে শুরু করার জন্য এখানে কিছু jscreens রয়েছে:
http://jsperf.com/prototypees-vs-funitions/4
emit
এবং on
যেমন undefined উত্ক্রান্ত করছে।
ডাব্লুপিআরএল এর প্রতিক্রিয়া যোগ করতে। তিনি "প্রোটোটাইপ" অংশটি মিস করেছেন:
function EventedObject(){
// Super constructor
EventEmitter.call(this);
return this;
}
EventObject.prototype = new EventEmitter(); //<-- you're missing this part
util.inherits
যেহেতু প্রচুর স্মার্ট ব্যক্তি আপনার পক্ষে সেই বিকল্পগুলি আপ টু ডেট রাখবে।