প্রোটোটাইপ তৈরি করার সময় কেন কনস্ট্রাক্টরদের ব্যবহারকে নিরুৎসাহিত করা হয়?


10

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

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

var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";

var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/

আমার প্রশ্নটি Some prototype object goes hereউপরের কোডে " " স্পটটিতে কোন কোডটি উচিত about আমার প্রথম প্রবৃত্তিটি পিতামাতার একটি উদাহরণ তৈরি করা (অর্থাত্‍ new Parent()), তবে একটি উত্তরের একটি মন্তব্যে এটি কি কোনও অবজেক্টের অন্য প্রোটোটাইপ অনুলিপি করার নিরাপদ উপায়? , একজন ব্যবহারকারী লিখেছেন:

না, new bar()প্রোটোটাইপ অবজেক্টের জন্য ব্যবহার করবেন না !

(... এটি একটি মতামত যা আমি অনেক এসও উত্তর এবং মন্তব্যে দেখেছি, তবে এই মুহুর্তে আমার একমাত্র উদাহরণ এটিই))

অন্য বিকল্প Object.create(Parent.prototype)হিসাবে হিসাবে ব্যবহার করা হয় Child.prototype। যতদূর আমি জানি, এটি একটি নতুন Parentউদাহরণও তৈরি করে তবে এটি Parentনির্মাণকারী চালায় না ।

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

উত্তর:


5

কারণ এটি এমন একটি ফাংশন যা কল করার প্রয়োজন নেই। newজাভাস্ক্রিপ্টে নিয়মিত ফাংশন কল থেকে আলাদা নয়।

একজন কনস্ট্রাক্টর কেবল নির্ধারিত ক্ষেত্রের চেয়ে আরও বেশি কিছু করতে পারে। উদাহরণস্বরূপ, যদি এটি আগত ডেটাগুলিকে বৈধতা দেয়, আপনি যখন উত্তরাধিকার শৃঙ্খলা সেট করার চেষ্টা করছিলেন তখনই আপনি বৈধতার ত্রুটি ঘটাবেন।

এবং আপনার দরকার নেই Object.create, এটি যথেষ্ট:

function objectCreate( proto ) {
    function T(){}
    T.prototype = proto;
    return new T();
}

তবে ঠিক Object.createএটাই বাস্তবায়িত হয়।
কেসি চু

পছন্দ করেছেন এবং আমি এটি উল্লেখ করেছি কারণ লিঙ্কযুক্ত পোস্টে কেউ বলেছিলেন " Object.createআইই 8 তে কাজ করে না" - আপনি যখন কোনও ব্রাউজারে 2 সেকেন্ডের মধ্যে এই ব্যবহারের ক্ষেত্রে এটি প্রয়োগ করতে পারেন তখন এটি কেবল অযথা মন্তব্য।
ইসাইলাইজা

2

এখন যেহেতু আমার বোঝাপড়াটি কিছুটা প্রসারিত হয়েছে, আমি একটি নির্দিষ্ট উদাহরণ দিয়ে এসাইলিজার জবাবটি তৈরি করতে চাই :

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

উদাহরণস্বরূপ, ধরুন Parentউদাহরণগুলির প্রতিটি idনির্মাণের সময় হিসাবে একটি অনন্য সম্পত্তি সেট রয়েছে:

var Parent = function() { this.id = Math.random(); }
Parent.prototype.parentProp = "some parent property";

var Child = function() { /* constructor business */ }
Child.prototype = new Parent();

এটি সমস্ত Child দৃষ্টান্তগুলির জন্য এককভাবে idপ্রাপ্ত উত্তরাধিকারসূত্রে প্রাপ্ত একক প্রোটোটাইপ সম্পত্তি ভাগ করে নেবে এবং কেবলমাত্র new Parent()হিসাবে ব্যবহৃত অবজেক্ট হিসাবে ব্যবহৃত হবে Child.prototype

এই ক্ষেত্রে আরও ভাল পন্থা Object.createশিশু নির্মাণকারীর ভিতরে অভিভাবক কনস্ট্রাক্টর (প্রয়োজনে) সরাসরি ব্যবহার এবং কল করা:

var Parent = function() { this.id = Math.random(); }
Parent.prototype.parentProp = "some parent property";

var Child = function() {
    // run `this` through the Parent constructor function
    Parent.apply(this, arguments);
}
Child.prototype = Object.create(Parent.prototype);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.