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


271

সুতরাং অবশেষে আমি এত বছর ধরে আমার পা টানা বন্ধ করে দিয়ে জাভাস্ক্রিপ্টটি "সঠিকভাবে" শেখার সিদ্ধান্ত নিয়েছি। ভাষাগুলির নকশার অন্যতম প্রধান বিষয় হ'ল এটি উত্তরাধিকারের বাস্তবায়ন। রুবির অভিজ্ঞতা আছে, আমি বন্ধ এবং গতিশীল টাইপিং দেখে সত্যিই খুশি হয়েছিলাম; কিন্তু আমার জীবনের জন্য অনুমান করতে পারি না উত্তরাধিকারের জন্য অন্যান্য দৃষ্টান্ত ব্যবহার করে অবজেক্ট দৃষ্টান্ত থেকে কী কী সুবিধা হবে benefits


সংশ্লিষ্ট stackoverflow.com/questions/879061/...
pramodc84

উত্তর:


560

আমি জানি যে এই উত্তরটি 3 বছর দেরীতে হয়েছে তবে আমি সত্যই মনে করি বর্তমান উত্তরগুলি ধ্রুপদী উত্তরাধিকারের চেয়ে প্রোটোটাইপাল উত্তরাধিকার কীভাবে ভাল সে সম্পর্কে পর্যাপ্ত তথ্য সরবরাহ করে না ।

প্রথমে জাভাস্ক্রিপ্ট প্রোগ্রামাররা প্রোটোটাইপাল উত্তরাধিকারের প্রতিরক্ষার জন্য সর্বাধিক প্রচলিত যুক্তি দেখি (আমি উত্তরগুলির বর্তমান পুল থেকে এই যুক্তিগুলি নিচ্ছি):

  1. ইহা সহজ.
  2. এটা শক্তিশালী।
  3. এটি ছোট, কম রিডানড্যান্ট কোডের দিকে নিয়ে যায়।
  4. এটি গতিশীল এবং তাই গতিশীল ভাষার পক্ষে এটি আরও ভাল।

এখন এই যুক্তিগুলি সমস্ত বৈধ, তবে কেন এটি ব্যাখ্যা করার ক্ষেত্রে কেউ মাথা ঘামায় না। এটি একটি শিশুকে বলার মতো যে গণিত অধ্যয়ন গুরুত্বপূর্ণ। অবশ্যই এটি অবশ্যই, তবে সন্তানের অবশ্যই যত্ন নেই; এবং আপনি ম্যাথসের মতো কোনও শিশুকে এটি গুরুত্বপূর্ণ বলে বলে তৈরি করতে পারবেন না।

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

  1. প্রোটোটাইপাল উত্তরাধিকারের প্রোটোটাইপাল প্যাটার্ন।
  2. প্রোটোটাইপাল উত্তরাধিকারের কনস্ট্রাক্টর প্যাটার্ন।

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

এবং আমরা এটিকে জাভাতে ছোট ভাই হিসাবে চাপছিলাম, যেমন ভিজুয়াল বেসিকের পরিপূরক ভাষাটি তখন মাইক্রোসফ্টের ভাষা পরিবারগুলিতে সি ++ ছিল।

এটি খারাপ কারণ লোকেরা যখন জাভাস্ক্রিপ্টে কনস্ট্রাক্টর ব্যবহার করে তখন তারা অন্য কনস্ট্রাক্টরের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কনস্ট্রাক্টরদের কথা ভাবেন। এটা ভুল. প্রোটোটাইপাল উত্তরাধিকারের বস্তুগুলিতে অন্য বস্তুগুলির উত্তরাধিকার সূত্রে প্রাপ্ত। নির্মাতারা কখনই ছবিতে আসে না। এটিই বেশিরভাগ মানুষকে বিভ্রান্ত করে।

শাস্ত্রীয় উত্তরাধিকারী জাভা জাতীয় ভাষার লোকেরা আরও বিভ্রান্ত হয়ে পড়ে কারণ নির্মাতারা ক্লাসগুলির মতো দেখতে তারা শ্রেণীর মতো আচরণ করে না। যেমন ডগলাস ক্রকফোর্ড বলেছেন:

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

ওখানে তোমার আছে। সোজা ঘোড়া মুখ থেকে.

সত্যিকারের প্রোটোটাইপাল উত্তরাধিকার

প্রোটোটাইপাল উত্তরাধিকার সমস্ত বিষয় সম্পর্কে। অবজেক্টগুলি অন্য বস্তুর সম্পত্তি থেকে উত্তরাধিকারী হয়। এখানেই শেষ এটা পেতে ওখানে যাও. প্রোটোটাইপাল উত্তরাধিকার ব্যবহার করে বস্তু তৈরির দুটি উপায় রয়েছে:

  1. একেবারে নতুন অবজেক্ট তৈরি করুন।
  2. একটি বিদ্যমান বস্তুর ক্লোন করুন এবং এটি প্রসারিত করুন।

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

যথেষ্ট আলাপ। আসুন কিছু উদাহরণ দেখুন। বলুন আমার কাছে ব্যাসার্ধের বৃত্ত রয়েছে 5:

var circle = {
    radius: 5
};

আমরা এর ব্যাসার্ধ থেকে বৃত্তের ক্ষেত্রফল এবং পরিধিটি গণনা করতে পারি:

circle.area = function () {
    var radius = this.radius;
    return Math.PI * radius * radius;
};

circle.circumference = function () {
    return 2 * Math.PI * this.radius;
};

এখন আমি ব্যাসার্ধের অন্য একটি বৃত্ত তৈরি করতে চাই 10। এটি করার একটি উপায় হ'ল:

var circle2 = {
    radius: 10,
    area: circle.area,
    circumference: circle.circumference
};

তবে জাভাস্ক্রিপ্ট একটি আরও ভাল উপায় - প্রতিনিধি দল সরবরাহ করেObject.createফাংশন এই কাজ করতে ব্যবহার করা হয়:

var circle2 = Object.create(circle);
circle2.radius = 10;

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

এখন আপনি জিজ্ঞাসা করতে পারেন, "এটি কীভাবে সহজ? আমি যখনই একটি নতুন চেনাশোনা তৈরি করতে চাই তখন আমার circleএটি ক্লোন করে ম্যানুয়ালি এটিকে একটি ব্যাসার্ধ নির্ধারণ করা উচিত"। সমাধানটি হ'ল আপনার জন্য ভারী উত্তোলন করতে কোনও ফাংশন ব্যবহার করা:

function createCircle(radius) {
    var newCircle = Object.create(circle);
    newCircle.radius = radius;
    return newCircle;
}

var circle2 = createCircle(10);

প্রকৃতপক্ষে আপনি এই সমস্তগুলিকে একক বস্তুর আক্ষরিক সাথে নীচে একত্রিত করতে পারেন:

var circle = {
    radius: 5,
    create: function (radius) {
        var circle = Object.create(this);
        circle.radius = radius;
        return circle;
    },
    area: function () {
        var radius = this.radius;
        return Math.PI * radius * radius;
    },
    circumference: function () {
        return 2 * Math.PI * this.radius;
    }
};

var circle2 = circle.create(10);

জাভাস্ক্রিপ্টে প্রোটোটাইপাল উত্তরাধিকার

আপনি যদি উপরের প্রোগ্রামটিতে লক্ষ্য করেন তবে createফাংশনটি একটি ক্লোন তৈরি করে circle, radiusএটিতে একটি নতুন নিয়োগ করে এবং তারপরে এটি প্রদান করে। এটি একটি নির্মাণকারীর জাভাস্ক্রিপ্টে ঠিক কী করে:

function Circle(radius) {
    this.radius = radius;
}

Circle.prototype.area = function () {
    var radius = this.radius;
    return Math.PI * radius * radius;
};

Circle.prototype.circumference = function () {         
    return 2 * Math.PI * this.radius;
};

var circle = new Circle(5);
var circle2 = new Circle(10);

জাভাস্ক্রিপ্টে কনস্ট্রাক্টর প্যাটার্ন হ'ল প্রোটোটাইপাল প্যাটার্নটি উল্টানো। বস্তু তৈরির পরিবর্তে আপনি একটি নির্মাণকারী তৈরি করুন। newশব্দ binds thisএর ক্লোন করার কন্সট্রাকটর ভিতরে পয়েন্টার prototypeকন্সট্রাকটর করুন।

বিভ্রান্ত লাগছে? এটি কারণ জাভাস্ক্রিপ্টে কনস্ট্রাক্টর প্যাটার্নটি অযৌক্তিকভাবে জিনিসগুলিকে জটিল করে তোলে। বেশিরভাগ প্রোগ্রামার এটি বুঝতে অসুবিধা বোধ করেন।

অন্যান্য বস্তু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত বস্তুর কথা চিন্তা না করে তারা অন্য নির্মাণকারীদের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কনস্ট্রাক্টরদের কথা ভাবেন এবং তারপরে একেবারে বিভ্রান্ত হন।

জাভাস্ক্রিপ্টে কনস্ট্রাক্টর প্যাটার্নটি এড়ানো উচিত কেন এমন আরও কয়েকটি কারণ রয়েছে। আপনি তাদের সম্পর্কে আমার ব্লগ পোস্টে এখানে পড়তে পারেন: নির্মাণকারী বনাম প্রোটোটাইপস


তাহলে শাস্ত্রীয় উত্তরাধিকারের তুলনায় প্রোটোটাইপাল উত্তরাধিকারের সুবিধাগুলি কী কী? আসুন আবার সর্বাধিক প্রচলিত যুক্তিগুলির মধ্য দিয়ে যান এবং কেন তা ব্যাখ্যা করুন ।

প্রোটোটাইপাল উত্তরাধিকার সহজ is

সিএমএস তার উত্তরে বলেছে:

আমার মতে প্রোটোটাইপাল উত্তরাধিকারের সবচেয়ে বড় সুবিধা হ'ল এর সরলতা।

আসুন আমরা কী করেছি তা বিবেচনা করা যাক। আমরা এমন একটি বস্তু তৈরি করেছি circleযার ব্যাসার্ধ ছিল 5। তারপরে আমরা এটি ক্লোন করে দিয়ে ক্লোনটিকে একটি ব্যাসার্ধ দিয়েছি 10

প্রোটোটাইপাল উত্তরাধিকার কাজ করতে আমাদের কেবল দুটি জিনিস প্রয়োজন:

  1. একটি নতুন অবজেক্ট তৈরি করার একটি উপায় (যেমন বস্তুর আক্ষরিক)।
  2. বিদ্যমান অবজেক্টকে বাড়ানোর একটি উপায় (যেমন Object.create)।

বিপরীতে শাস্ত্রীয় উত্তরাধিকার অনেক জটিল is শাস্ত্রীয় উত্তরাধিকারে আপনার রয়েছে:

  1. ক্লাস।
  2. অবজেক্ট।
  3. ইন্টারফেস।
  4. বিমূর্ত ক্লাস।
  5. ফাইনাল ক্লাস
  6. ভার্চুয়াল বেস ক্লাস।
  7. কন্সট্রাকটর।
  8. Destructors।

আপনি ধারণা পেতে। মুল বক্তব্যটি হ'ল প্রোটোটাইপাল উত্তরাধিকারগুলি বোঝা সহজ, বাস্তবায়ন করা সহজ এবং তর্ক করার পক্ষে সহজ।

স্টিভ ইয়েজ যেমনটি তাঁর ধ্রুপদী ব্লগ পোস্ট " একটি N00b এর প্রতিকৃতি " পোস্ট করেছেন :

মেটাডেটা হ'ল যেকোন ধরণের বর্ণনা বা মডেল something আপনার কোডের মন্তব্যগুলি কেবল গণনার প্রাকৃতিক ভাষার বর্ণনা are মেটাটাটা মেটা-ডেটা কী করে তা হ'ল এটি কঠোরভাবে প্রয়োজনীয় নয়। আমার যদি কিছু বংশধর কাগজপত্রের সাথে একটি কুকুর থাকে এবং আমি কাগজপত্রটি হারাতে পারি তবে আমার কাছে এখনও পুরোপুরি বৈধ কুকুর রয়েছে।

একই অর্থে ক্লাসগুলি কেবল মেটা-ডেটা। উত্তরাধিকারের জন্য ক্লাসগুলি কঠোরভাবে প্রয়োজন হয় না। তবে কিছু লোক (সাধারণত n00bs) ক্লাসে কাজ করতে আরও স্বাচ্ছন্দ্য বোধ করে। এটি তাদের নিরাপত্তার একটি মিথ্যা ধারণা দেয়।

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

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

2. প্রোটোটাইপাল উত্তরাধিকার শক্তিশালী

শাস্ত্রীয় পটভূমি থেকে আসা বেশিরভাগ প্রোগ্রামাররা যুক্তিযুক্ত যে উত্তরাধিকার সূত্রে প্রোটোটাইপাল উত্তরাধিকারের চেয়ে আরও শক্তিশালী কারণ এটিতে রয়েছে:

  1. ব্যক্তিগত ভেরিয়েবল।
  2. একাধিক উত্তরাধিকার।

এই দাবিটি মিথ্যা। আমরা ইতিমধ্যে জানি যে জাভাস্ক্রিপ্ট ক্লোজারগুলির মাধ্যমে ব্যক্তিগত ভেরিয়েবলগুলিকে সমর্থন করে তবে একাধিক উত্তরাধিকার সম্পর্কে কী বলা যায়? জাভাস্ক্রিপ্টে অবজেক্টগুলির কেবল একটি প্রোটোটাইপ রয়েছে।

সত্যটি হ'ল প্রোটোটাইপাল উত্তরাধিকার একাধিক প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে সমর্থন করে। প্রোটোটাইপাল উত্তরাধিকারের অর্থ কেবল একটি বস্তু অন্য বস্তুর উত্তরাধিকার সূত্রে প্রাপ্ত হয়। আসলে আছে প্রটোটাইপ ইনহেরিটেন্স বাস্তবায়ন করার দুটি উপায় :

  1. ডেলিগেশন বা ডিফারেনশিয়াল উত্তরাধিকার
  2. ক্লোনিং বা কনট্যাটেনটিভ উত্তরাধিকার

হ্যাঁ জাভাস্ক্রিপ্ট কেবলমাত্র বস্তুগুলিকে অন্য একটি অবজেক্টের প্রতিনিধিত্ব করতে দেয়। তবে এটি আপনাকে একটি স্বেচ্ছাসেবী সংখ্যক সামগ্রীর বৈশিষ্ট্য অনুলিপি করতে দেয়। উদাহরণস্বরূপ _.extendকেবল এটি করে।

অবশ্যই অনেক প্রোগ্রামার এটিকে সত্য উত্তরাধিকার হিসাবে বিবেচনা করে না instanceofএবং isPrototypeOfঅন্যথায় বলে। তবে সহজেই প্রতিটি বস্তুতে প্রোটোটাইপগুলির একটি অ্যারে সংরক্ষণ করে সহজেই প্রতিকার করা যেতে পারে যা প্রোটোটাইপ থেকে উত্তোলনের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হয়:

function copyOf(object, prototype) {
    var prototypes = object.prototypes;
    var prototypeOf = Object.isPrototypeOf;
    return prototypes.indexOf(prototype) >= 0 ||
        prototypes.some(prototypeOf, prototype);
}

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

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

জাভাস্ক্রিপ্টে তবে আপনি সম্ভবত হীরা সমস্যাটি কখনই শুনতে পাবেন না কারণ আপনি কোন সম্পত্তিটি উত্তরাধিকারী করতে চান এবং কোন প্রোটোটাইপগুলি থেকে সঠিকভাবে নিয়ন্ত্রণ করতে পারেন।

৩. প্রোটোটাইপাল উত্তরাধিকার কম অপ্রয়োজনীয়

এই বিষয়টি ব্যাখ্যা করা একটু বেশিই কঠিন কারণ শাস্ত্রীয় উত্তরাধিকার অগত্যা আরও বেশি রিলান্ড্যান্ট কোডের দিকে পরিচালিত করে না। প্রকৃতপক্ষে উত্তরাধিকার, ধ্রুপদী বা প্রোটোটাইপাল, কোডের অনর্থকতা হ্রাস করতে ব্যবহৃত হয়।

একটি যুক্তি হতে পারে যে শাস্ত্রীয় উত্তরাধিকার সহ বেশিরভাগ প্রোগ্রামিং ভাষা স্ট্যাটিকালি টাইপ করা হয় এবং ব্যবহারকারীকে স্পষ্টভাবে প্রকারগুলি ঘোষণা করতে হয় (হাস্কেলের বিপরীতে যার মধ্যে রয়েছে স্থির স্ট্যাটিক টাইপিং)। সুতরাং এটি আরও ভার্বোস কোড বাড়ে।

জাভা এই আচরণের জন্য কুখ্যাত। আমি স্পষ্টভাবে স্মরণ করি বব নাইস্ট্রোম প্র্যাট পার্সার্স সম্পর্কে তাঁর ব্লগ পোস্টে নিম্নলিখিত উপাখ্যানটির উল্লেখ করেছেন :

আপনি এখানে আমলাতন্ত্রের স্তরের জাভা "" দয়া করে এটি চতুর্ভুজে সাইন ইন করুন love

আবার, আমি মনে করি এটি কেবল কারণ জাভা এত চুষছে।

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

যেহেতু প্রোটোটাইপাল উত্তরাধিকার একাধিক উত্তরাধিকারের জন্য মঞ্জুরি দেয় তাই একাধিক উত্তরাধিকারের জন্য কোডটি কম রিন্ডন্ড্যান্ট যা প্রোটোটাইপাল উত্তরাধিকার ব্যবহার করে এমন ভাষায় লেখা হয় যা শাস্ত্রীয় উত্তরাধিকার রয়েছে তবে একাধিক উত্তরাধিকার নেই।

৪. প্রোটোটাইপাল উত্তরাধিকার গতিশীল

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

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

উপসংহার

প্রোটোটাইপাল উত্তরাধিকার সংক্রান্ত বিষয়। প্রোটোটাইপাল উত্তরাধিকারের প্রোটোটাইপাল প্যাটার্নের পক্ষে প্রোটোটাইপাল উত্তরাধিকারের কনস্ট্রাক্টর প্যাটার্নটি কেন ত্যাগ করবেন সে সম্পর্কে জাভাস্ক্রিপ্ট প্রোগ্রামারদের শিক্ষিত করা গুরুত্বপূর্ণ।

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

প্রোটোটাইপাল প্যাটার্ন ব্যবহার করে কেবল প্রোটোটাইপাল উত্তরাধিকার ব্যাখ্যা করা সহজ হবে না, তবে এটি আরও ভাল প্রোগ্রামার তৈরি করবে।

যদি আপনি এই উত্তরটি পছন্দ করেন তবে আপনার "ব্লগ প্রোটোটাইপাল হেরিটাইজেন্স বিষয়গুলি কেন " এ আমার ব্লগ পোস্টটি পড়া উচিত । বিশ্বাস করুন, আপনি হতাশ হবেন না।


33
আপনি কোথায় থেকে এসেছেন তা আমি বুঝতে পেরেছিলাম এবং আমি সম্মত হয়েছি যে প্রোটোটাইপাল উত্তরাধিকারটি খুব দরকারী, আমি এই ধারণাটি তৈরি করে "প্রোটোটাইপাল উত্তরাধিকার ধ্রুপদী উত্তরাধিকারের চেয়ে ভাল" আপনি ইতিমধ্যে ব্যর্থ হওয়ার নিয়ত হয়ে গেছেন the আপনাকে কিছুটা দৃষ্টিকোণ দেওয়ার জন্য, আমার লাইব্রেরি জেটাইপস জাভাস্ক্রিপ্টের জন্য একটি ধ্রুপদী উত্তরাধিকার লাইব্রেরি। সুতরাং একটি ছেলে হয়ে ওঠার জন্য সময় নিয়েছে, আমি এখনও এখানে বসে বলব প্রোটোটাইপাল উত্তরাধিকারটি দুর্দান্ত এবং খুব দরকারী। তবে এটি একটি প্রোগ্রামার যে অনেকের মধ্যে কেবল একটি সরঞ্জাম has প্রোটোটাইপাল উত্তরাধিকার হিসাবে এখনও অনেক অসুবিধা রয়েছে।
redline করুন

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

9
ভাল এটি আপনার মতামত, তবে আমি একমত হতে থাকব না, এবং আমি মনে করি কফিস্ক্রিপ্ট এবং টাইপস্ক্রিপ্টের মতো জিনিসের ক্রমবর্ধমান জনপ্রিয়তা দেখায় যে বিকাশকারীদের একটি বৃহত সম্প্রদায় রয়েছে যারা উপযুক্ত হলে এই কার্যকারিতাটি কাজে লাগাতে চায়। যেমনটি আপনি বলেছেন, ইএস 6 সিনট্যাকটিক চিনি যুক্ত করেছে, তবে এখনও জেটিপাইপসের বিস্তৃতি উপলব্ধ করে না। পার্শ্ব নোটে, আমি আপনার ডাউনটোটের জন্য দায়বদ্ধ নই। যদিও আমি আপনার সাথে একমত নই, আমি মনে করি না এটির আপনার কোনও খারাপ উত্তর রয়েছে। আপনি খুব ভাল ছিল।
রেডলাইন

25
আপনি ক্লোন শব্দটি প্রচুর ব্যবহার করছেন যা সাধারণভাবে ভুল। Object.createনির্দিষ্ট প্রোটোটাইপ দিয়ে নতুন অবজেক্ট তৈরি করছে। আপনার শব্দ নির্বাচনের ফলে প্রোটোটাইপ ক্লোন হয়ে যায় এমন ধারণা দেয়।
পাভেল হোরাল

7
@ অ্যাডিট: আসলে এতটা রক্ষণাত্মক হওয়ার দরকার নেই। আপনার উত্তরটি খুব বিশদ এবং ভোটের উপযুক্ত। আমি পরামর্শ দিচ্ছিলাম না যে "লিঙ্কযুক্ত" "ক্লোন" এর জন্য একটি ড্রপ-ইন প্রতিস্থাপন হওয়া উচিত, তবে এটি যে কোনও বস্তু এবং এটির উত্তরাধিকার সূত্রে প্রাপ্ত প্রোটোটাইপের মধ্যে সংযোগটি আরও সঠিকভাবে বর্ণনা করে, আপনি যদি "ক্লোন" শব্দটির নিজের সংজ্ঞাটি স্বীকার করেন কিনা। " অথবা না. এটি পরিবর্তন করুন বা পরিবর্তন করবেন না, এটি সম্পূর্ণ আপনার পছন্দ।
অ্যান্ডি ই

42

আমাকে আসলে ইনলাইন প্রশ্নের উত্তর দেওয়ার অনুমতি দিন।

প্রোটোটাইপ উত্তরাধিকারের নিম্নোক্ত গুণাবলী রয়েছে:

  1. এটি গতিশীল ভাষাগুলির পক্ষে আরও উপযুক্ত because ।
  2. ক্লাসিক শ্রেণি / অবজেক্ট ডিকোটমি স্কিমগুলির চেয়ে প্রোটোটাইপিং অবজেক্ট স্কিমটি কার্যকর করা সহজ।
  3. এটি "মেটাক্লাসস" এর মতো অবজেক্ট মডেলের আশেপাশে জটিল তীক্ষ্ণ প্রান্তগুলির প্রয়োজনকে সরিয়ে দেয় (আমি কখনই পছন্দ করি নি মেটাক্লাস ... দুঃখিত!) বা "ইগেনভ্যালুগুলি" বা এর মতো।

তবে এর নিম্নলিখিত অসুবিধাগুলি রয়েছে:

  1. প্রোটোটাইপ ভাষা পরীক্ষা করা টাইপ করা অসম্ভব নয় তবে এটি খুব, খুব কঠিন। প্রোটোটাইপিকাল ভাষার বেশিরভাগ "টাইপ চেকিং" হ'ল খাঁটি রান-টাইম "হাঁসের টাইপিং"-স্টাইল চেক। এটি সমস্ত পরিবেশের জন্য উপযুক্ত নয়।
  2. স্থির (বা প্রায়শই এমনকি গতিশীল!) বিশ্লেষণ দ্বারা পদ্ধতি প্রেরণের অনুকূলকরণের মতো কাজগুলিও একইভাবে করা কঠিন। এটা তোলে করতে (আমি জোর: করতে পারেন ) খুব সহজেই খুব অদক্ষ হতে।
  3. একইভাবে অবজেক্ট তৈরি আরও প্রচলিত শ্রেণি / অবজেক্ট ডিকোটোমি স্কিমের চেয়ে প্রোটোটাইপিং ভাষায় অনেক ধীর হতে পারে (এবং সাধারণত এটি হয়)।

আমি মনে করি আপনি উপরের লাইনের মধ্যে পড়তে পারেন এবং traditionalতিহ্যগত শ্রেণি / অবজেক্ট স্কিমগুলির সম্পর্কিত সুবিধা এবং অসুবিধাগুলি নিয়ে আসতে পারেন। অবশ্যই প্রতিটি ক্ষেত্রের আরও অনেক কিছু রয়েছে তাই আমি বাকী উত্তরগুলি অন্য ব্যক্তির উপর ছেড়ে দেব।


1
আরে দেখুন, একটি সংক্ষিপ্ত উত্তর যা ফ্যানবয় নয়। সত্যই কামনা করুন এই প্রশ্নের শীর্ষ উত্তর ছিল।
সিলিকনরোক স্টার

আমাদের আজ ডাইনামিক জাস্ট-ইন-টাইম সংকলক রয়েছে যা কোডটি প্রতিটি বিভাগের জন্য বিভিন্ন টুকরো কোড তৈরি করে চলাকালীন কোডটি সংকলন করতে পারে। জাভাস্ক্রিপ্ট প্রকৃতপক্ষে রুবি বা পাইথনের চেয়ে দ্রুততর যা ক্লাসিকাল ক্লাস ব্যবহার করে কারণ আপনি প্রোটোটাইপগুলি ব্যবহার করেন যদিও এটিকে অনুকূলকরণের জন্য প্রচুর কাজ করা হয়েছে।
aoeu256

28

প্রোটোটাইপাল উত্তরাধিকারের প্রধান সুবিধা আইএমও এর সরলতা।

ভাষার প্রটোটাইপ প্রকৃতি কারা গুলান পারেন ধ্রুপদী প্রশিক্ষিত, কিন্তু এটা দেখা যাচ্ছে যে আসলে এই একটি হল সত্যিই সহজ এবং শক্তিশালী ধারণা ডিফারেনশিয়াল উত্তরাধিকার

আপনার শ্রেণিবদ্ধকরণ করার দরকার নেই , আপনার কোডটি ছোট, কম রিন্ডন্ড্যান্ট, অবজেক্টগুলি অন্যের থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, আরও সাধারণ অবজেক্ট।

আপনি যদি প্রোটোটাইপিকভাবে ভাবেন তবে শীঘ্রই আপনি লক্ষ্য করবেন যে আপনার ক্লাসের দরকার নেই ...

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

var obj = Object.create(baseInstance);

মানকটির এই নতুন সংস্করণটি সমস্ত ব্রাউজার বিক্রেতারা প্রয়োগ করছেন এবং আমি মনে করি আমরা আরও খাঁটি প্রোটোটাইপাল উত্তরাধিকার দেখতে শুরু করব ...


11
"আপনার কোডটি ছোট, কম অপ্রয়োজনীয় ...", কেন? আমি "ডিফারেন্সিয়াল ইনহেরেটেন্স" এর জন্য উইকিপিডিয়া লিঙ্কটি দেখেছি এবং এই দাবির পক্ষে সমর্থন করার মতো কিছুই নেই। কেন ধ্রুপদী উত্তরাধিকার বৃহত্তর, আরও বেশি রিলান্ডান্ট কোডের ফলাফল করবে?
নোয়েল আবরহামস

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

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

প্রোটোটাইপগুলি দুর্দান্ত, আইএমও। আমি হাস্কেলের মতো একটি কার্যকরী ভাষা তৈরি করার কথা ভাবছি ... তবে বিমূর্ততা তৈরির পরিবর্তে আমি সমস্ত কিছু প্রোটোটাইপের ভিত্তিতে করব। যোগফলকে সাধারণীকরণের পরিবর্তে, এবং "ভাঁজ" করার জন্য ফ্যাকটোরিয়াল আপনার যোগফলের প্রোটোটাইপ করে এবং পণ্যটি তৈরি করতে + এর সাথে * এবং 0 এর সাথে প্রতিস্থাপন করে। আমি "মনডস" কে প্রোটোটাইপ হিসাবে ব্যাখ্যা করব যা প্রতিশ্রুতি / কলব্যাকগুলি থেকে "তখন" প্রতিস্থাপন করে ফ্ল্যাটম্যাপ "তখন" এর প্রতিশব্দ হিসাবে। আমি মনে করি প্রোটোটাইপগুলি জনগণের মধ্যে কার্যকরী প্রোগ্রামিং আনতে সহায়তা করতে পারে।
aoeu256

11

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

প্রটোটাইপ

var single = { status: "Single" },
    princeWilliam = Object.create(single),
    cliffRichard = Object.create(single);

console.log(Object.keys(princeWilliam).length); // 0
console.log(Object.keys(cliffRichard).length); // 0

// Marriage event occurs
princeWilliam.status = "Married";

console.log(Object.keys(princeWilliam).length); // 1 (New instance property)
console.log(Object.keys(cliffRichard).length); // 0 (Still refers to prototype)

উদাহরণ পদ্ধতি সহ ক্লাসিকাল (অপর্যাপ্ত কারণ প্রতিটি উদাহরণ তার নিজস্ব সম্পত্তি সঞ্চয় করে)

function Single() {
    this.status = "Single";
}

var princeWilliam = new Single(),
    cliffRichard = new Single();

console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 1

দক্ষ শাস্ত্রীয়

function Single() {
}

Single.prototype.status = "Single";

var princeWilliam = new Single(),
    cliffRichard = new Single();

princeWilliam.status = "Married";

console.log(Object.keys(princeWilliam).length); // 1
console.log(Object.keys(cliffRichard).length); // 0
console.log(cliffRichard.status); // "Single"

যেমন আপনি দেখতে পাচ্ছেন, যেহেতু শাস্ত্রীয় শৈলীতে ঘোষিত "ক্লাস" এর প্রোটোটাইপটি পরিচালনা করা সম্ভব, তাই প্রোটোটাইপাল উত্তরাধিকার ব্যবহারের কোনও লাভ নেই। এটি শাস্ত্রীয় পদ্ধতির একটি উপসেট।


2
এই বিষয় সম্পর্কে অন্যান্য উত্তর এবং সংস্থানগুলির দিকে তাকালে আপনার উত্তরটি বলে উঠবে যে: "প্রোটোটাইপাল উত্তরাধিকারটি জাভাস্ক্রিপ্টে ক্লাসিকাল উত্তরাধিকারের উপস্থিতির অনুমতি দেওয়ার জন্য যুক্ত সিনট্যাকটিক চিনির একটি উপসেট"। ওপি জাভাস্ক্রিপ্টের মধ্যে ইনস্ট্যান্টেশন কৌশলগুলির তুলনায় অন্য ভাষায় শাস্ত্রীয় উত্তরাধিকারের চেয়ে জেএসে প্রোটোটাইপাল উত্তরাধিকারের সুবিধা সম্পর্কে জিজ্ঞাসা করছে বলে মনে হয়।
একটি ফেডার অন্ধকারে

2

ওয়েব বিকাশ: প্রোটোটাইপাল উত্তরাধিকার বনাম ক্লাসিকাল উত্তরাধিকার

http://chamnapchhorn.blogspot.com/2009/05/prototypal-inheritance-vs-classical.html

ক্লাসিকাল বনাম প্রোটোটাইপাল উত্তরাধিকার - স্ট্যাক ওভারফ্লো

ক্লাসিকাল বনাম প্রোটোটাইপাল উত্তরাধিকার


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

প্রথম লিঙ্ক প্রোটোটাইপাল উত্তরাধিকার কেন এই প্রশ্নের উত্তর দেয় না ? এটি কেবল এটি বর্ণনা করে।
ভাইবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.