জাভাস্ক্রিপ্ট: ক্লাস.মোথড বনাম ক্লাস.প্রোটোটাইপ.মোথড


498

নিম্নলিখিত দুটি ঘোষণার মধ্যে পার্থক্য কী?

Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }

প্রথম বিবৃতিটিকে স্থির পদ্ধতির ঘোষণা হিসাবে এবং দ্বিতীয় বিবৃতিটিকে উদাহরণ পদ্ধতির ঘোষণা হিসাবে ভাবা কি ঠিক হবে?

উত্তর:


696

হ্যাঁ, প্রথম ফাংশনের কোনও নির্মাণকারীর ফাংশনের কোনও অবজেক্টের সাথে কোনও সম্পর্ক নেই , আপনি এটিকে একটি 'স্ট্যাটিক পদ্ধতির' মতো বিবেচনা করতে পারেন ।

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

দ্বিতীয় ফাংশন, আপনি কন্সট্রাক্টর ফাংশন প্রোটোটাইপটি প্রসারিত করার সাথে সাথে এটি newকীওয়ার্ড দিয়ে তৈরি সমস্ত অবজেক্টের জন্য উপলব্ধ হবে এবং সেই ফাংশনের ( thisকীওয়ার্ড) প্রসঙ্গটি আপনাকে প্রকৃত অবজেক্টের উদাহরণ হিসাবে উল্লেখ করবে যেখানে আপনি এটি কল করেছেন।

এই উদাহরণ বিবেচনা করুন:

// constructor function
function MyClass () {
  var privateVariable; // private member only available within the constructor fn

  this.privilegedMethod = function () { // it can access private members
    //..
  };
}

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
  // the 'this' keyword refers to the object instance
  // you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();

1
তবে ফাংশন.প্রোটোটাইপ.মোথড == ফাংশন.মোথড কেন?
রাঘবেন্দ্র

1
@ রাঘভেন্দ্র এটি নয়
জর্জিটোন

1
@ মেনদা আপনার লিঙ্কটি মারা গেছে
ইউজেন সানিক

19

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

এজন্য প্রোটোটাইপগুলি স্মৃতি সংরক্ষণ করে।

এছাড়াও, আপনি যদি পিতামাতার অবজেক্টের বৈশিষ্ট্যগুলি পরিবর্তন করেন তবে কি সন্তানের সংশ্লিষ্ট সম্পত্তিটি পরিবর্তন করা হয়নি, এটি আপডেট করা হবে।


15

ভিজ্যুয়াল শিখার জন্য, যখন ফাংশনটি ছাড়াই সংজ্ঞা দেওয়া হয় .prototype

ExampleClass = function(){};
ExampleClass.method = function(customString){
             console.log((customString !== undefined)? 
                          customString : 
                          "called from func def.");}
ExampleClass.method(); // >> output: `called from func def.`  

var someInstance = new ExampleClass();
someInstance.method('Called from instance');
    // >> error! `someInstance.method is not a function`  

একই কোড সহ, যদি .prototypeযুক্ত করা হয়,

ExampleClass.prototype.method = function(customString){
             console.log((customString !== undefined)? 
                          customString : 
                          "called from func def.");}
ExampleClass.method();  
      // > error! `ExampleClass.method is not a function.`  

var someInstance = new ExampleClass();
someInstance.method('Called from instance');
                 // > output: `Called from instance`

এটি পরিষ্কার করার জন্য,

ExampleClass = function(){};
ExampleClass.directM = function(){}  //M for method
ExampleClass.prototype.protoM = function(){}

var instanceOfExample = new ExampleClass();

ExampleClass.directM();      works
instanceOfExample.directM();   x Error!

ExampleClass.protoM();     x Error!
instanceOfExample.protoM();   works

**** উপরের উদাহরণের জন্য দ্রষ্টব্য, কিছুInstance.method () হিসাবে কার্যকর করা হবে না, উদাহরণস্ল্যাস.মোথড
() ত্রুটির কারণ এবং মৃত্যুদন্ড কার্যকর হতে পারে না।
তবে চিত্রণ এবং সহজ বোঝার জন্য, আমি এই ক্রমটি রেখেছি * ****

কোড থেকে পদক্ষেপ নিতে উপরের jsbin লিঙ্কে chrome developer console& ক্লিক করুন থেকে প্রাপ্ত ফলাফল । + সহ মন্তব্য বিভাগে টগল করুনJS Bin

ctrl/


15

হ্যাঁ, প্রথমটিকে একটি static methodবলা হয় class method, এবং দ্বিতীয়টি হ'ল একটি instance method

আরও বিস্তারিতভাবে বুঝতে, নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন।

ES5 এ

function Person(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
}

Person.isPerson = function(obj) {
   return obj.constructor === Person;
}

Person.prototype.sayHi = function() {
   return "Hi " + this.firstName;
}

উপরের কোডে, isPersonএকটি স্ট্যাটিক পদ্ধতি, যখন এটির sayHiএকটি উদাহরণ পদ্ধতি Person

নীচে, Personকনস্ট্রাক্টর থেকে কীভাবে একটি অবজেক্ট তৈরি করা যায় তা হল ।

var aminu = new Person("Aminu", "Abubakar");

স্থির পদ্ধতি ব্যবহার করে isPerson

Person.isPerson(aminu); // will return true

উদাহরণ পদ্ধতি ব্যবহার করে sayHi

aminu.sayHi(); // will return "Hi Aminu"

ES6 এ

class Person {
   constructor(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   static isPerson(obj) {
      return obj.constructor === Person;
   }

   sayHi() {
      return `Hi ${this.firstName}`;
   }
}

staticস্থির পদ্ধতিটি ঘোষণার জন্য কীওয়ার্ডটি কীভাবে ব্যবহৃত হয়েছিল তা দেখুন isPerson

Personশ্রেণীর একটি অবজেক্ট তৈরি করা ।

const aminu = new Person("Aminu", "Abubakar");

স্থির পদ্ধতি ব্যবহার করে isPerson

Person.isPerson(aminu); // will return true

উদাহরণ পদ্ধতি ব্যবহার করে sayHi

aminu.sayHi(); // will return "Hi Aminu"

দ্রষ্টব্য: উভয় উদাহরণই মূলত একই, জাভাস্ক্রিপ্ট একটি শ্রেণিবদ্ধ ভাষা হিসাবে রয়ে গেছে। ইএস 6-classপ্রবর্তিত হ'ল মূলত বিদ্যমান প্রোটোটাইপ-ভিত্তিক উত্তরাধিকারের মডেলটির চেয়ে একটি সিনট্যাকটিকাল চিনি।


"ES6" এ আপনি কেবল একটি সিনট্যাক্স চিনির বর্ণনা দেন। এটি "ES2015" নয় (দয়া করে প্রত্যেকে ES6 যথাযথ শব্দ ES2015 ব্যবহার করা বন্ধ করুন) এটি করার পদ্ধতি। এটি করা সহজভাবেই অন্য উপায় এবং আমার মতে ভুল উপায়।
কার্ল মরিসন

2
@ কার্লমরিসন আমিনু "এটি করার উপায়" লিখেছেন নি আপনি নিজে লিখেছেন এবং এতে ব্যতিক্রমও লিখেছেন। আপনার বক্তব্য ES6 বনাম ES2015 সম্পর্কে ন্যায্য হতে পারে তবে কথোপকথনে লোকেরা প্রায়শই দক্ষতার জন্য একটি সংক্ষিপ্ত সম্মেলন অবলম্বন করে, তাই আমি মনে করি এটি লিখন থেকে অপসারণ করা সম্ভব নয় বা নিশ্চিতভাবেই পরামর্শ দেওয়া উচিত।
Wulwong

আপনার উত্তরের ES6 অংশের জন্য আপনাকে ধন্যবাদ; এটি অনেক কিছুই স্পষ্ট করে, বিশেষত উপরোক্ত 2 "জনসাধারণ + সুবিধাযুক্ত" উত্তরের সাথে একত্রিত হলে। আমি যদিও আপনার উদাহরণ হিসাবে পুরোপুরি বিভ্রান্ত যদিও আমি ... Whaaat? কোন ক্লাস ইনস্ট্যান্টের কনস্ট্রাক্টর নিজেই ক্লাসটি কীভাবে তৈরি করতে পারে ...? (এটি কোনও সেটের একটি উপসেটটি সেট নিজেই বলা ইত্যাদি))obj.constructor === Persontrue===
অ্যান্ড্রু

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