প্রোটোটাইপাল উত্তরাধিকার কীভাবে শাস্ত্রীয় উত্তরাধিকার থেকে পৃথক?


27

উত্তরাধিকার, পলিমারফিজম এবং এনক্যাপসুলেশন হ'ল ওওপির তিনটি স্বতন্ত্র, গুরুত্বপূর্ণ বৈশিষ্ট্য এবং সেগুলি থেকে, উত্তরাধিকারের এই দিনগুলিতে ব্যবহারের উচ্চ পরিসংখ্যান রয়েছে। আমি জাভাস্ক্রিপ্ট শিখছি, এবং এখানে, তারা সকলেই বলে যে এর প্রোটোটাইপাল উত্তরাধিকার রয়েছে, এবং সর্বত্র লোকেরা বলে যে এটি শাস্ত্রীয় উত্তরাধিকার থেকে অনেক আলাদা

তবে, আমি বুঝতে পারি না ব্যবহারিক ব্যবহারের দিক থেকে তাদের পার্থক্য কী? অন্য কথায়, আপনি যখন একটি বেস ক্লাসটি (প্রোটোটাইপ) সংজ্ঞায়িত করেন এবং এর থেকে কিছু উপক্ল্যাস সংগ্রহ করেন, তখন আপনার দু'জনেরই আপনার বেস শ্রেণির ফাংশনালাইটগুলি অ্যাক্সেস থাকে এবং আপনি উত্পন্ন ক্লাসগুলিতে ক্রিয়াকলাপ বাড়িয়ে তুলতে পারেন। যদি আমি যা বলেছিলাম তা উত্তরাধিকারের অভিযুক্ত ফলাফল হিসাবে বিবেচনা করে থাকে, তবে আমরা প্রোটোটাইপাল বা ক্লাসিক সংস্করণটি ব্যবহার করছি তবে কেন আমাদের যত্ন করা উচিত?

নিজেকে আরও পরিষ্কার করতে, আমি প্রোটোটাইপাল এবং ক্লাসিক উত্তরাধিকারের উপযোগিতা এবং ব্যবহারের ধরণগুলির মধ্যে কোনও পার্থক্য দেখতে পাচ্ছি না। তারা উভয় একই জিনিস হ'ল ওওডের ফলস্বরূপ, কেন তারা পৃথক হয় তা জানতে আমার আগ্রহ নেই This কীভাবে ব্যবহারিকভাবে (তাত্ত্বিকভাবে নয়) প্রোটোটাইপাল উত্তরাধিকার ধ্রুপদী উত্তরাধিকার থেকে পৃথক?

উত্তর:


6

জেএস ওও সম্পর্কে সাম্প্রতিক ব্লগ পোস্ট

আমি বিশ্বাস করি যে আপনার তুলনাটি জাভাস্ক্রিপ্টে শাস্ত্রীয় ওও অনুকরণ এবং শাস্ত্রীয় ওও এবং অবশ্যই আপনি কোনও পার্থক্য দেখতে পাচ্ছেন না।

দাবি অস্বীকার: "জাভাস্ক্রিপ্টে প্রোটোটাইপাল ওও" দিয়ে "প্রোটোটাইপাল ওও" -এর সমস্ত উল্লেখ প্রতিস্থাপন করুন। আমি স্ব বা অন্য কোনও প্রয়োগের সুনির্দিষ্ট বিবরণ জানি না।

তবে প্রোটোটাইপাল ওও আলাদা। প্রোটোটাইপগুলির সাহায্যে আপনার কেবল অবজেক্ট থাকে এবং আপনি কেবলমাত্র অন্য অবজেক্টগুলির প্রোটোটাইপ শৃঙ্খলে ইনজেক্ট করতে পারেন। যখনই আপনি কোনও বস্তুর কোনও সম্পত্তি অ্যাক্সেস করেন আপনি সেই বস্তুটি এবং প্রোটোটাইপ শৃঙ্খলে থাকা কোনও বস্তু সন্ধান করেন।

প্রোটোটাইপাল ওও এর জন্য এনক্যাপসুলেশন সম্পর্কে কোনও ধারণা নেই। এনক্যাপসুলেশন স্কোপ, ক্লোজার এবং প্রথম শ্রেণির ফাংশনগুলির বৈশিষ্ট্য তবে প্রোটোটাইপাল ওওর সাথে কিছুই করার নেই nothing উত্তরাধিকারের কোনও ধারণা নেই, লোকে যাকে "উত্তরাধিকার" বলে আখ্যায়িত করে তা হ'ল কেবল বহুবাদী।

এটিতে বহুবর্ষ আছে।

উদাহরণ স্বরূপ

var Dog = {
  walk: function() { console.log("walks"); }
}

var d = Object.create(Dog);
d.walk();

স্পষ্টতই dপদ্ধতিতে অ্যাক্সেস রয়েছে এবং এটি Dog.walkবহুত্ববাদ প্রদর্শন করে।

সুতরাং আসলে একটি বড় পার্থক্য আছে । আপনার কেবল পলিমারফিজম রয়েছে।

তবে যেমনটি উল্লেখ করা হয়েছে, আপনি যদি এটি করতে চান (তবে আপনি কেন করবেন তা আমার কোনও ধারণা নেই) আপনি জাভাস্ক্রিপ্টে শাস্ত্রীয় ওও অনুকরণ করতে পারেন এবং (সীমাবদ্ধ) এনক্যাপসুলেশন এবং উত্তরাধিকারের অ্যাক্সেস পেতে পারেন।


1
প্রোটোটাইপিক উত্তরাধিকারের জন্য রেইনস, গুগল এবং আপনি দেখতে পাবেন যে প্রোটোটাইপাল উত্তরাধিকার উঠে এসেছে। এমনকি ইয়াহু থেকেও!
সা Saeedদ নেমতি

@ সাeedদ উত্তরাধিকার একটি অস্পষ্ট শব্দ এবং সাধারণত অপব্যবহার করা হয়। "উত্তরাধিকার" এর সাথে তারা কী বোঝায় আমি "বহুবিজ্ঞান" লেবেল করি। সংজ্ঞাগুলি খুব অস্পষ্ট।
রায়নোস

না রেইনস, আমার অর্থ প্রোটোটাইপাল শব্দটি সঠিক শব্দ, প্রোটোটাইপিকাল নয় । উত্তরাধিকার সম্পর্কে আমি কথা
বলিনি

1
@ সাeedদ those সেই টাইপগুলির মধ্যে একটি আমার মনে কেবল ফাঁকা। আমি তাতে মনোযোগ দিচ্ছি না
রায়নস

1
হুম .. পরিভাষা। ick। আমি যেভাবে জাভাস্ক্রিপ্ট অবজেক্টগুলি তাদের প্রোটোটাইপগুলির সাথে "প্রতিনিধি দল" এর সাথে সম্পর্কিত তা কল করব। বহুবিজ্ঞান আমার কাছে নিম্ন স্তরের উদ্বেগ বলে মনে হয়, এই ভিত্তিতে যে প্রদত্ত নামটি বিভিন্ন বস্তুর জন্য বিভিন্ন কোডকে নির্দেশ করতে পারে on
শান ম্যাকমিলান

15

ধ্রুপদী উত্তরাধিকার পিতা-মাতার শ্রেণি থেকে কোনও রাষ্ট্র ছাড়াই আচরণের উত্তরাধিকারী হয়। বস্তু তাত্ক্ষণিকভাবে মুহুর্তে এটি আচরণের উত্তরাধিকারী হয়।

প্রোটোটাইপাল উত্তরাধিকার পিতামাত্ত বস্তু থেকে আচরণ এবং স্থিতি লাভ করে। বস্তুটির বলা হওয়ার মুহুর্তে এটি আচরণ ও রাষ্ট্রের উত্তরাধিকার সূত্রে প্রাপ্ত। রান-টাইমে যখন প্যারেন্ট অবজেক্ট পরিবর্তন হয়, তখন শিশু বস্তুর অবস্থা এবং আচরণ প্রভাবিত হয়।

প্রোটোটাইপাল উত্তরাধিকারের "সুবিধা" হ'ল আপনি আপনার সমস্ত বস্তু তাত্ক্ষণিকভাবে চালিত হওয়ার পরে অবস্থা এবং আচরণ "প্যাচ" করতে পারেন। উদাহরণস্বরূপ, এক্সট্রা জেএস ফ্রেমওয়ার্কটিতে ফ্রেমওয়ার্কটি ইনস্ট্যান্ট হওয়ার পরে ফ্রেমওয়ার্কের মূল উপাদানগুলিকে প্যাচ করা "ওভাররাইড" লোড করা সাধারণ।


4
অনুশীলনে, আপনি যদি উত্তরাধিকার সূত্রে রাষ্ট্র প্রাপ্ত হন তবে আপনি নিজেকে আঘাতের দুনিয়ার জন্য প্রস্তুত করছেন। উত্তরাধিকার সূত্রে ভাগ করা হবে যদি এটি অন্য কোনও বস্তুর উপরে থাকে।
শান ম্যাকমিলান

1
এটি আমার কাছে ঘটে যায় যে জাভাস্ক্রিপ্টে আসলেই রাষ্ট্রের থেকে পৃথক আচরণের কোনও ধারণা নেই। কনস্ট্রাক্টর ফাংশন বাদে সমস্ত আচরণকে অন্য কোনও রাজ্যের মতো পোস্ট-অবজেক্ট-ক্রিয়েশন বরাদ্দ করা / সংশোধন করা যেতে পারে।
জোয়েরি সেব্রেচটস

সুতরাং পাইথনের শাস্ত্রীয় উত্তরাধিকার নেই? আমার যদি থাকে class C(object): def m(self, x): return x*2এবং তারপরে instance = C()আমি যখন দৌড়ে instance.m(3)যাই তখনই পাই 6। কিন্তু যদি আমি তারপর পরিবর্তন Cতাই C.m = lambda s, x: x*xআমি চালানোর instance.m(3)আমি এখন পেতে 9। একই হয় যদি আমি class D(C)একটি পদ্ধতি তৈরি করি এবং Cতারপরে কোনও Dপদ্ধতি পরিবর্তন করি তবে পরিবর্তিত পদ্ধতিটি গ্রহণের যে কোনও উদাহরণ । আমি কি ভুল বোঝাবুঝি করছি বা এর অর্থ এই যে পাইথনের আপনার সংজ্ঞা অনুযায়ী শাস্ত্রীয় উত্তরাধিকার নেই?
এমভিসিএইচআর

@ এমভিসিএইচআর: আপনি এখনও আচরণের উত্তরাধিকারী হয়ে রয়েছেন এবং সেই ক্ষেত্রে বিবৃতি দিচ্ছেন না, যা শাস্ত্রীয় উত্তরাধিকারের দিকে নির্দেশ করে তবে এটি "বিষয়টি সেই মুহূর্তে তাত্ক্ষণিকভাবে আচরণের উত্তরাধিকারী" হওয়ার সংজ্ঞা সহ আমার ইস্যুটিকে নির্দেশ করে। আমি সংজ্ঞাটি কীভাবে সংশোধন করব তা নিশ্চিত নয়।
জোয়েরি সেব্রেচটস

9

প্রথম: বেশিরভাগ সময়, আপনি অবজেক্টগুলি ব্যবহার করবেন, সেগুলি সংজ্ঞায়িত করবেন না এবং উভয় দৃষ্টান্তের নিরিখে অবজেক্টগুলি ব্যবহার করা সমান।

দ্বিতীয়: বেশিরভাগ প্রোটোটাইপাল পরিবেশগুলি শ্রেণিবদ্ধ পরিবেশ হিসাবে একই ধরণের বিভাজন ব্যবহার করে - উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিগুলির সাথে উদাহরণ হিসাবে পরিবর্তিত ডেটা। সুতরাং আবার খুব সামান্য পার্থক্য আছে। ( এই স্ট্যাকের ওভারফ্লো প্রশ্নের আমার উত্তর এবং ক্লাস ছাড়াই স্ব-কাগজ সংগঠিত প্রোগ্রামগুলি দেখুন See পিডিএফ সংস্করণের জন্য সিটিসিয়ারটি দেখুন ))

তৃতীয়: জাভাস্ক্রিপ্টের গতিশীল প্রকৃতির অনেক বড় প্রভাব রয়েছে যা এই ধরণের উত্তরাধিকার। যে কোনও ধরণের বেসের অবজেক্টকে নির্ধারিত করে আমি সমস্ত ধরণের ক্ষেত্রে একটি নতুন পদ্ধতি যুক্ত করতে পারি তা পরিষ্কার ঝরঝরে, তবে ক্লাসটি পুনরায় খোলা রেখে রুবিতেও আমি একই জিনিস করতে পারি।

চতুর্থ: ব্যবহারিক পার্থক্যগুলি ছোট, তবে ব্যবহার করতে ভুলে যাওয়ার ব্যবহারিক সমস্যাটি আরও newঅনেক বড় - যেটি newপ্রোটোটাইপাল এবং শাস্ত্রীয় কোডের মধ্যে পার্থক্যের দ্বারা প্রভাবিত হওয়ার চেয়ে আপনার অনুপস্থিত হওয়ার চেয়ে বেশি সম্ভাবনা রয়েছে ।

যা যা বলেছিল, প্রোটোটাইপাল এবং শাস্ত্রীয় উত্তরাধিকারের মধ্যে ব্যবহারিক পার্থক্যটি হ'ল আপনার জিনিস-দ্য হোল্ড-পদ্ধতিগুলি (শ্রেণিগুলি) আপনার জিনিস-হোল্ড-ডেটা (উদাহরণস্বরূপ as) এর সমান, এর অর্থ হল আপনি আপনার ক্লাসগুলি তৈরি করতে পারবেন টুকরোচিয়া, সমস্ত একই জিনিস অবলম্বন সরঞ্জাম যা আপনি যে কোনও পরিস্থিতিতে ব্যবহার করবেন using (এটি আসলে, সমস্ত শ্রেণীর-অনুকরণের লাইব্রেরি এটি কীভাবে করে। অন্যদের মতো না-করার মতো, ট্র্যারিটস.জেএস দেখুন ) look আপনি যদি রূপক হয়ে থাকেন তবে এটি প্রাথমিকভাবে আকর্ষণীয়।


হ্যাঁ, সেরা উত্তর আইএমও!
আইভার

0

জাভাস্ক্রিপ্টে প্রোটোটাইপাল উত্তরাধিকার এই গুরুত্বপূর্ণ উপায়ে ক্লাস থেকে পৃথক:

কনস্ট্রাক্টরগুলি কেবল ফাংশন যা আপনি কল ছাড়াই করতে পারেন new:

function Circle (r, x, y) { 
  //stuff here
}
Var c = new Circle();
Circle.call(c, x, y, z); //This works and you can do it over and over again.

কোনও ব্যক্তিগত ভেরিয়েবল বা পদ্ধতি নেই, সর্বোপরি আপনি এটি করতে পারেন:

function Circle (r, x, y) {
  var color = 'red';
  function drawCircle () {
    //some code here with x, y and r
  }
  drawCircle();
  this.setX = function (x_) {
    x = x_;
    drawCircle();
  }

}
Circle.prototype.getX = function () {
   //Can't access x!
}

পূর্ববর্তী উদাহরণে আপনি শ্রেণিকে অর্থবহভাবে প্রসারিত করতে পারবেন না যদি আপনি ভুয়া বেসরকারী ভেরিয়েবল এবং পদ্ধতিগুলির আশ্রয় নেন এবং আপনি যে কোনও সর্বজনীন পদ্ধতি ঘোষনা করেছেন প্রতিবার নতুন উদাহরণ তৈরি হওয়ার পরে পুনরায় তৈরি করা হবে।


আপনি অর্থগতভাবে "শ্রেণি" প্রসারিত করতে পারেন। আপনি শুধু স্থানীয় ভেরিয়েবল অ্যাক্সেস করতে পারছি না color, r, x, yএবং drawCircleযে আভিধানিক সুযোগ আবদ্ধ হয়Circle
Raynos

এটি সত্য, আপনি এটি করতে পারেন তবে প্রতিবার কোনও উদাহরণ তৈরি করার সময় তৈরি হওয়া প্রসঙ্গে যুক্ত হওয়া 'পাবলিক' পদ্ধতিগুলির গুচ্ছ তৈরি না করে আপনি এটি করতে পারবেন না।
বিয়ন্সের

এটি আপনি খুব ব্যবহার করছেন এমন এক বিচিত্র প্যাটার্ন। Circle.call()কনস্ট্রাক্টর হিসাবে? দেখে মনে হচ্ছে আপনি "ফাংশনাল অবজেক্টস" (একটি মিসনোমার ...) বর্ণনা করার চেষ্টা করছেন
শান ম্যাকমিলান

এটি এমন কিছু নয় যা আমি কখনও করতাম, আমি কেবল বলে দিচ্ছি যে জাভা স্ক্রিপ্ট দিয়ে কনস্ট্রাক্টরকে বারবার কল করা সম্ভব তবে traditionalতিহ্যগত ক্লাসের ভাষায় নয়।
বিয়ন্সের

1
তবে এই পার্থক্যগুলি কীভাবে 'গুরুত্বপূর্ণ'? আমি কোনও ফাংশন কল করে, নতুনকে 'গুরুত্বপূর্ণ' হিসাবে ব্যবহার না করে কেবলমাত্র একটি ছোট বাক্য গঠন পার্থক্য করে অবজেক্টগুলি নির্মাণ করতে দেখছি না। তেমনি, ব্যক্তিগত ভেরিয়েবল না থাকা মৌলিকভাবে পৃথক নয়, কেবল একটি সামান্য পার্থক্য। প্লাস, আপনি করতে পারেন উপায় আপনি বর্ণনা ব্যক্তিগত ভেরিয়েবল (অনুরূপ কিছু), আছে।
রোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.