জাভাস্ক্রিপ্টে কোনও শ্রেণি সংজ্ঞায়িত করার জন্য কোন কৌশলগুলি ব্যবহার করা যেতে পারে এবং তাদের ট্রেড-অফগুলি কী কী?


686

আমি এখন যেমন কাজ করছি তার মতো বড় আকারের প্রকল্পগুলিতে আমি ওওপি ব্যবহার করতে পছন্দ করি। আমার জাভাস্ক্রিপ্টে বেশ কয়েকটি ক্লাস তৈরি করা দরকার তবে আমি যদি ভুল না হয়ে থাকি তবে এটি করার জন্য কমপক্ষে কয়েকটি উপায় রয়েছে। সিনট্যাক্সটি কী হবে এবং কেন সেভাবে করা হবে?

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



3
ব্যক্তিগতভাবে, আমি ফাংশন বডিটির ভিতরে ক্লাসের সদস্যদের ঘোষণা করতে পছন্দ করি। ক্লাসের মতো আরও বেশি আচরণ করার জন্য ক্লোজার তৈরি করতে আমি 'এই ফিক্সিং দ্য' কৌশলটি ব্যবহার করি। আমি আমার ব্লগে একটি বিস্তারিত উদাহরণ পেয়েছি: ncombo.wordpress.com/2012/12/30/…
জন

আমি বেশিরভাগ সি ++ ওওপি কার্যকারিতা জাভাস্ক্রিপ্টে একটি সাধারণ এবং প্রাকৃতিক সিনট্যাক্স সহ পোর্ট করেছি। : এখানে আমার উত্তর দেখুন stackoverflow.com/a/18239463/1115652

জাভাস্ক্রিপ্টে কোনও ক্লাস নেই। তবে আপনি যদি জেএসে শ্রেণিবদ্ধ আচরণের অনুকরণ করতে চান তবে আপনি পারেন। এতে বিশদটি দেখুন: symfony-world.blogspot.com/2013/10/…
ducin

উত্তর:


743

কোনও বাহ্যিক গ্রন্থাগার ব্যবহার না করে এটি করার উপায় এখানে:

// Define a class like this
function Person(name, gender){

   // Add object properties like this
   this.name = name;
   this.gender = gender;
}

// Add methods like this.  All Person objects will be able to invoke this
Person.prototype.speak = function(){
    alert("Howdy, my name is" + this.name);
};

// Instantiate new objects with 'new'
var person = new Person("Bob", "M");

// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"

এখন আসল উত্তরটি তার চেয়ে অনেক জটিল। উদাহরণস্বরূপ, জাভাস্ক্রিপ্টে ক্লাসের মতো জিনিস নেই। জাভাস্ক্রিপ্ট একটি prototypeভিত্তিক উত্তরাধিকার স্কিম ব্যবহার করে ।

তদাতিরিক্ত, অসংখ্য জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরি রয়েছে যা জাভাস্ক্রিপ্টে ক্লাসের মতো কার্যকারিতা অনুমানের নিজস্ব স্টাইল রয়েছে। আপনি কমপক্ষে প্রোটোটাইপ এবং jQuery চেক আউট করতে চাইবেন ।

এর মধ্যে কোনটি "সেরা" তা স্থির করে স্ট্যাক ওভারফ্লোতে একটি পবিত্র যুদ্ধ শুরু করার এক দুর্দান্ত উপায়। যদি আপনি একটি বৃহত্তর জাভাস্ক্রিপ্ট-ভারী প্রকল্প শুরু করেন, তবে এটি একটি জনপ্রিয় লাইব্রেরি শিখতে এবং তাদের উপায়ে করা অবশ্যই উপযুক্ত। আমি একজন প্রোটোটাইপ লোক, তবে স্ট্যাক ওভারফ্লো jQuery এর দিকে ঝুঁকছে বলে মনে হচ্ছে।

বাহ্যিক গ্রন্থাগারগুলির উপর কোনও নির্ভরতা ছাড়াই কেবল "এটি করার একটি উপায়" যতটা আছে, আমি যেভাবে লিখেছি তা এটি বেশ প্রশংসিত।


48
তবে এটি এক্স ভাষার মতো কাজ করে না যেখানে আমি একমাত্র সঠিক পদ্ধতি শিখেছি যে কোনও জিনিস যা বস্তুর উদাহরণ তৈরি করতে ব্যবহৃত হয় তা কাজ করা উচিত :(
এরিক রেপেন


1
@ ডেভিড - সম্ভবত এটি হয়েছে, তবে আর মনে হচ্ছে না ..?
কাইরেন জনস্টোন

6
jQuery এমনকি শ্রেণীর মতো কার্যকারিতা তৈরির কোনও উপায় সরবরাহ করে না ??? (এটির সমস্ত ক্লাস হ'ল সিএসএস ক্লাস) আপনার উত্তরের সেই অংশটি থেকে এটি সরিয়ে দেওয়া উচিত।
বার্গি

7
2015 এর সেকেন্ড অর্ধেক থেকে ইকামাস্ক্রিপ্ট 6 নতুন স্ট্যান্ডার্ড প্রকাশিত হয়েছিল, তাই আমি এটিকে নতুন উপায়ে (অনেক বেশি ক্লিনার এবং ইজিলার) করার প্রস্তাব করছি es6-features.org/#
ক্লাসের

213

জাভাস্ক্রিপ্টে কোনও শ্রেণি সংজ্ঞায়নের সর্বোত্তম উপায় হ'ল কোনও ক্লাস সংজ্ঞা না দেওয়া।

সিরিয়াসলি।

অবজেক্ট-ওরিয়েন্টেশনের বিভিন্ন স্বাদ রয়েছে যার মধ্যে কয়েকটি হ'ল:

  • ক্লাস-ভিত্তিক ওও (ছোট্ট টাল্ক দ্বারা প্রথম প্রবর্তিত)
  • প্রোটোটাইপ-ভিত্তিক ওও (প্রথমে স্ব দ্বারা প্রবর্তিত)
  • মাল্টিমোথড-ভিত্তিক ওও (প্রথমে কমনলুপস দ্বারা প্রবর্তিত, আমি মনে করি)
  • ভবিষ্যদ্বাণী-ভিত্তিক ওও (কোনও ধারণা নেই)

এবং সম্ভবত অন্যদের সম্পর্কে আমি জানি না।

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

অন্য কথায়: কোনও ক্লাস নেই।

জাভাস্ক্রিপ্টের আসলে সেই মডেলটির একটি দুর্দান্ত টুইট রয়েছে: নির্মাতারা। আপনি বিদ্যমান বিদ্যমানগুলি অনুলিপি করে কেবল অবজেক্ট তৈরি করতে পারবেন না, আপনি এগুলি "পাতলা বাতাসের বাইরে" তৈরি করতে পারেন, তাই কথা বলতে। আপনি newকীওয়ার্ড সহ কোনও ফাংশন কল করলে , সেই ফাংশনটি কনস্ট্রাক্টর হয়ে যায় এবং thisকীওয়ার্ডটি বর্তমান অবজেক্টের দিকে নির্দেশ করবে না পরিবর্তে একটি নতুন নির্মিত "খালি" একটিকে। সুতরাং, আপনি আপনার পছন্দ মতো কোনও বস্তু কনফিগার করতে পারেন। এইভাবে, জাভাস্ক্রিপ্ট নির্মাতারা traditionalতিহ্যগত শ্রেণিভিত্তিক ওওতে ক্লাসগুলির অন্যতম ভূমিকা নিতে পারে: নতুন বস্তুর জন্য টেমপ্লেট বা নীলনকশা হিসাবে পরিবেশন করছে।

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


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

83

ES2015 ক্লাস

ES2015 নির্দিষ্টকরণে, আপনি প্রোটোটাইপ সিস্টেমে ক্লাস সিনট্যাক্সটি ব্যবহার করতে পারেন যা কেবলমাত্র চিনির।

class Person {
  constructor(name) {
    this.name = name;
  }
  toString() {
    return `My name is ${ this.name }.`;
  }
}

class Employee extends Person {
  constructor(name, hours) {
    super(name);
    this.hours = hours;
  }
  toString() {
    return `${ super.toString() } I work ${ this.hours } hours.`;
  }
}

উপকারিতা

মূল সুবিধাটি হ'ল স্থির বিশ্লেষণ সরঞ্জামগুলি এই সিনট্যাক্সটিকে লক্ষ্য করা সহজ করে find শ্রেণিভিত্তিক ভাষা থেকে আসা অন্যদের পক্ষে বহুভাষিক হিসাবে ভাষাটি ব্যবহার করা আরও সহজ।

আদেশ সহকারে

এর বর্তমান সীমাবদ্ধতা থেকে সাবধান থাকুন। ব্যক্তিগত সম্পত্তি অর্জনের জন্য, অবশ্যই সিম্বলস বা উইকম্যাপস ব্যবহার করতে হবে । ভবিষ্যতে প্রকাশে, অনুপস্থিত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করার জন্য ক্লাসগুলি সম্ভবত প্রসারিত হবে।

সমর্থন

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

সম্পদ


56

আমি ড্যানিয়েল এক্স মুর ব্যবহার করতে পছন্দ করি {SUPER: SYSTEM}। এটি এমন একটি শৃঙ্খলা যা সত্য উদাহরণের ভেরিয়েবল, বৈশিষ্ট্য ভিত্তিক উত্তরাধিকার, শ্রেণি শ্রেণিবিন্যাস এবং কনফিগারেশন বিকল্পগুলির মতো সুবিধা প্রদান করে। নীচের উদাহরণটি সত্য উদাহরণের ভেরিয়েবলগুলির ব্যবহারের চিত্রিত করে, যা আমি বিশ্বাস করি এটিই সবচেয়ে বড় সুবিধা। যদি আপনার উদাহরণ ভেরিয়েবলগুলির প্রয়োজন না হয় এবং কেবলমাত্র সরকারী বা ব্যক্তিগত ভেরিয়েবলগুলি নিয়ে খুশি হন তবে সম্ভবত আরও সহজ সিস্টেম রয়েছে।

function Person(I) {
  I = I || {};

  Object.reverseMerge(I, {
    name: "McLovin",
    age: 25,
    homeState: "Hawaii"
  });

  return {
    introduce: function() {
      return "Hi I'm " + I.name + " and I'm " + I.age;
    }
  };
}

var fogel = Person({
  age: "old enough"
});
fogel.introduce(); // "Hi I'm McLovin and I'm old enough"

বাহ, এটি নিজের পক্ষে খুব বেশি কার্যকর নয়, তবে একটি সাবক্লাস যুক্ত করে দেখুন:

function Ninja(I) {
  I = I || {};

  Object.reverseMerge(I, {
    belt: "black"
  });

  // Ninja is a subclass of person
  return Object.extend(Person(I), {
    greetChallenger: function() {
      return "In all my " + I.age + " years as a ninja, I've never met a challenger as worthy as you...";
    }
  });
}

var resig = Ninja({name: "John Resig"});

resig.introduce(); // "Hi I'm John Resig and I'm 25"

আরেকটি সুবিধা হ'ল মডিউল এবং বৈশিষ্ট্য ভিত্তিক উত্তরাধিকার রাখার ক্ষমতা।

// The Bindable module
function Bindable() {

  var eventCallbacks = {};

  return {
    bind: function(event, callback) {
      eventCallbacks[event] = eventCallbacks[event] || [];

      eventCallbacks[event].push(callback);
    },

    trigger: function(event) {
      var callbacks = eventCallbacks[event];

      if(callbacks && callbacks.length) {
        var self = this;
        callbacks.forEach(function(callback) {
          callback(self);
        });
      }
    },
  };
}

ব্যক্তি শ্রেণীর থাকার উদাহরণে বাইন্ডেবল মডিউল অন্তর্ভুক্ত থাকে।

function Person(I) {
  I = I || {};

  Object.reverseMerge(I, {
    name: "McLovin",
    age: 25,
    homeState: "Hawaii"
  });

  var self = {
    introduce: function() {
      return "Hi I'm " + I.name + " and I'm " + I.age;
    }
  };

  // Including the Bindable module
  Object.extend(self, Bindable());

  return self;
}

var person = Person();
person.bind("eat", function() {
  alert(person.introduce() + " and I'm eating!");
});

person.trigger("eat"); // Blasts the alert!

প্রকাশ: আমি ড্যানিয়েল এক্স মুর এবং এটি আমার {SUPER: SYSTEM}। জাভাস্ক্রিপ্টে কোনও শ্রেণি সংজ্ঞায়নের সেরা উপায়।


@ ড্যানিয়েলএক্সমুর "ইনস্ট্যান্স ভেরিয়েবলগুলি একটি শ্রেণীর স্বতন্ত্র উদাহরণগুলির মধ্যে ভাগ করা হয়" এগুলি উদাহরণ ভেরিয়েবল নয়, সেগুলি স্ট্যাটিক / ক্লাস ভেরিয়েবল।
জ্যাব

2
@ জ্যাব এটি ভুল, স্ট্যাটিক / শ্রেণীর ভেরিয়েবলগুলি একটি শ্রেণীর সমস্ত দৃষ্টান্তের মধ্যে ভাগ করা হয় । প্রতিটি উদাহরণের নিজস্ব উদাহরণ ভেরিয়েবল রয়েছে।
ড্যানিয়েল এক্স মুর

(অন্য উপায় রাখুন, শব্দ "উদাহরণস্বরূপ পরিবর্তনশীল" স্বাভাবিক অর্থ ব্যবহার করে, হোক বা না হোক একটি পরিবর্তনশীল এক পরিবর্তনশীল অভিগম্যতা স্তরে লম্ব হয়।)
Jab

2
সেরা এক্সডি দাবি করার জন্য আপনি প্রায় একটি সুপারহিরোর মতো শোনালেন
দাদান

জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করে জাভাস্ক্রিপ্ট ক্লাস সংজ্ঞায়িত করার জন্য একটি সহজ পদ্ধতির: wapgee.com/story/i/203
ইলিয়াস করিম

41
var Animal = function(options) {
    var name = options.name;
    var animal = {};

    animal.getName = function() {
        return name;
    };

    var somePrivateMethod = function() {

    };

    return animal;
};

// usage
var cat = Animal({name: 'tiger'});

কোনও কিছু আমদানি না করে ব্যবহারযোগ্য অবজেক্ট কাঠামো তৈরি করার এটি একটি খুব মার্জিত উপায়। আমি রেসিগের ক্লাস সিস্টেমটি ব্যবহার করছিলাম তবে আমি এটি আরও ভাল পছন্দ করতে পারি। ধন্যবাদ.
টিম স্কোলিক

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

33

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

উদাহরণ 1:

obj = new Object();
obj.name = 'test';
obj.sayHello = function() {
    console.log('Hello '+ this.name);
}

উদাহরণ 2:

obj = {};
obj.name = 'test';
obj.sayHello = function() {
    console.log('Hello '+ this.name);
}
obj.sayHello();

উদাহরণ 3:

var obj = function(nameParam) {
    this.name = nameParam;
}
obj.prototype.sayHello = function() {
    console.log('Hello '+ this.name);
}

উদাহরণ 4: অবজেক্ট.ক্রিয়েট () এর আসল সুবিধা। দয়া করে উল্লেখ করুন [এই লিঙ্ক]

var Obj = {
    init: function(nameParam) {
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var usrObj = Object.create(Obj);  // <== one level of inheritance

usrObj.init('Bob');
usrObj.sayHello();

5 উদাহরণ (কাস্টমাইজড ক্রকফোর্ডের অবজেক্ট.ক্রিয়েট):

Object.build = function(o) {
   var initArgs = Array.prototype.slice.call(arguments,1)
   function F() {
      if((typeof o.init === 'function') && initArgs.length) {
         o.init.apply(this,initArgs)
      }
   }
   F.prototype = o
   return new F()
}
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}}  // For example

var userB = {
    init: function(nameParam) {
        this.id = MY_GLOBAL.nextId();
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var bob = Object.build(userB, 'Bob');  // Different from your code
bob.sayHello();


উত্তরটি ES6 / ES2015 দিয়ে আপডেট করার জন্য

একটি শ্রেণি এভাবে সংজ্ঞায়িত করা হয়:

class Person {
    constructor(strName, numAge) {
        this.name = strName;
        this.age = numAge;
    }

    toString() {
        return '((Class::Person) named ' + this.name + ' & of age ' + this.age + ')';
    }
}

let objPerson = new Person("Bob",33);
console.log(objPerson.toString());

1
@ জাস্টিন: দয়া করে আমাকে জানান যেটি বৈধ নয়?
অমল এম কুলকার্নি

এই স্বরলিপিগুলি অধ্যয়ন করার সময়, আমি এই.সেট () এও হোঁচট খেয়েছি। উদাহরণস্বরূপ: this.set ('পোর্ট', 3000)। আমার অনুমান, বস্তুর জন্য বন্দর সম্পত্তি সেট করতে এটি ব্যবহৃত হয়। যদি তা হয় তবে কেন আমরা সরাসরি ব্যবহার করব না: {পোর্ট: 3000}} এমন কোনও ডকুমেন্টেশন রয়েছে যেখানে আমি আরও বিশদ পেতে পারি।
আদিত্যঃ

24

আমার মনে হয় আপনি ডগলাস Crockford এর পড়া উচিত জাভাস্ক্রিপ্ট মধ্যে প্রটোটাইপ ইনহেরিটেন্স এবং জাভাস্ক্রিপ্ট মধ্যে শাস্ত্রীয় উত্তরাধিকার

তার পৃষ্ঠা থেকে উদাহরণ:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

প্রভাব? এটি আপনাকে আরও মার্জিত উপায়ে পদ্ধতি যুক্ত করার অনুমতি দেবে:

function Parenizor(value) {
    this.setValue(value);
}

Parenizor.method('setValue', function (value) {
    this.value = value;
    return this;
});

আমি তার ভিডিওগুলিও প্রস্তাব করি: উন্নত জাভাস্ক্রিপ্ট

আপনি তার পৃষ্ঠায় আরও ভিডিও পেতে পারেন: http://javascript.crockford.com/ জন রিসিগ বইয়ে আপনি ডগলাস ক্রকফোরের ওয়েবসাইট থেকে অনেকগুলি উদাহরণ পেতে পারেন।


25
এটা শুধু আমার? কীভাবে এই হ্যাক আরও মার্জিত? আমি ফাংশন সংজ্ঞাগুলি 'strings'অনেকগুলি নামের সাথে প্রকৃত হিসাবে কল করব , তবে মার্জিত তাদের মধ্যে
একটিও নয়

4
@ জ্যাব, তবে প্রতিবিম্ব ব্যতিক্রম, নিয়ম নয়। উপরের পদ্ধতিটি সহ, আপনাকে স্ট্রিং সহ আপনার সমস্ত পদ্ধতি ঘোষণা করতে হবে
কির্ক ওল

16

কারণ আমি YUI / ক্রকফোর্ড কারখানার পরিকল্পনাকে স্বীকার করব না এবং যেহেতু আমি জিনিসগুলিকে স্বতঃস্ফূর্ত রাখতে এবং বর্ধনযোগ্য রাখতে চাই এটি আমার ভিন্নতা:

function Person(params)
{
  this.name = params.name || defaultnamevalue;
  this.role = params.role || defaultrolevalue;

  if(typeof(this.speak)=='undefined') //guarantees one time prototyping
  {
    Person.prototype.speak = function() {/* do whatever */};
  }
}

var Robert = new Person({name:'Bob'});

যেখানে আদর্শভাবে টাইপফ পরীক্ষাটি প্রথম পদ্ধতির প্রোটোটাইপের মতো কিছুতে হয়


আমি এটা পছন্দ করি. আমি প্রায়শই জেএসের স্ট্যান্ডার্ড সিনট্যাক্স ব্যবহার করি কারণ আমি প্রতিটি বস্তুর উদাহরণে ফাংশনগুলি অনুলিপি করতে পছন্দ করি না। যদিও আমি সর্বদা স্ব অন্তর্ভুক্ত সমাধানের সৌন্দর্যটি মিস করেছি এবং এটি এটি বেশ ভাল সমাধান করে।
লুকাসজ কোরজিবস্কি

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

15

আপনি যদি সরল হয়ে যাচ্ছেন তবে আপনি "নতুন" কীওয়ার্ড পুরোপুরি এড়াতে পারবেন এবং কেবল কারখানার পদ্ধতি ব্যবহার করতে পারেন। আমি এটি মাঝে মাঝে পছন্দ করি কারণ আমি জেএসএন ব্যবহার করে অবজেক্ট তৈরি করতে পছন্দ করি।

function getSomeObj(var1, var2){
  var obj = {
     instancevar1: var1,
     instancevar2: var2,
     someMethod: function(param)
     {  
          //stuff; 
     }
  };
  return obj;
}

var myobj = getSomeObj("var1", "var2");
myobj.someMethod("bla");

যদিও আমি নিশ্চিত না যে বড় বস্তুর জন্য পারফরম্যান্স হিট কী।


Obj.instancevar1 = var1 লাইনটি প্রয়োজনীয় নয়, যেহেতু অভ্যন্তরীণ বস্তুটির getSomeObj () এর পরামিতিগুলিতে অ্যাক্সেস থাকবে।
ট্রিপটিচ

কি দারুন. এটি আমার মস্তিষ্ককে আঘাত করে তবে এটিতে একটি নির্দিষ্ট কমনীয়তা রয়েছে। সুতরাং "obj.instancevar1 = var1" অংশটি এক ধরণের নির্মাণকারীর সূচনা, আমি মনে করি?
করিম

সবেমাত্র ট্রিপটিচের মন্তব্য দেখেছি। আমি দেখি. সুতরাং, আপনি কেবল "উদাহরণস্বরূপ: var1" এর মতো কিছু করতে পারেন যেখানে অভ্যন্তরীণ অবজেক্টটি ইনস্ট্যান্ট করা হচ্ছে।
করিম

হুবহু ... আপনি যখন কোনও অবজেক্টকে সংজ্ঞায়িত করতে {, ব্যবহার করেন, তখন বর্তমানে এটির সুযোগগুলিতে থাকা ভেরিয়েবলগুলির অ্যাক্সেস থাকতে পারে।
স্যাম

10
এই পদ্ধতির সাহায্যে আপনি উত্তরাধিকারী হওয়ার ক্ষমতাটি ছেড়ে দিয়েছেন এবং যেহেতু আপনি অবজেক্ট.প্রোটোটাইপ.সামান্য কিছু ব্যবহার করছেন না আপনি প্রতিবার যখন জিনিসটি ব্যবহার করছেন তখন আরও বেশি মেমরি এবং ধীর।
কিছু

12
var Student = (function () {
    function Student(firstname, lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.fullname = firstname + " " + lastname;
    }

    Student.prototype.sayMyName = function () {
        return this.fullname;
    };

    return Student;
}());

var user = new Student("Jane", "User");
var user_fullname = user.sayMyName();

টাইপস্ক্রিপ্টটি জাভাস্ক্রিপ্টে কনস্ট্রাক্টরের সাথে ক্লাস সংকলন করে Tha


10

সহজ উপায়টি হ'ল:

function Foo(a) {
  var that=this;

  function privateMethod() { .. }

  // public methods
  that.add = function(b) {
    return a + b;
  };
  that.avg = function(b) {
    return that.add(b) / 2; // calling another public method
  };
}

var x = new Foo(10);
alert(x.add(2)); // 12
alert(x.avg(20)); // 15

এর কারণটি thatহ'ল thisযদি আপনি ইভেন্ট হ্যান্ডলার হিসাবে কোনও পদ্ধতি দেন তবে আপনি অন্য কোনও কিছুর সাথে আবদ্ধ হতে পারেন, সুতরাং আপনি ইনস্ট্যান্টেশনের সময় মানটি সংরক্ষণ করুন এবং এটি পরে ব্যবহার করুন।

সম্পাদনা: এটি অবশ্যই সর্বোত্তম উপায় নয়, কেবল একটি সহজ উপায়। আমিও ভাল উত্তরের জন্য অপেক্ষা করছি!


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

1
সেক্ষেত্রে এটি কি প্রয়োজনীয় (বাছাই), তবে আপনি সরবরাহ করেছেন এমন সহজ কেস নয়।
ট্রিপটিচ

9

আপনি সম্ভবত ফোল্ডিং প্যাটার্নটি ব্যবহার করে কোনও প্রকার তৈরি করতে চান:

    // Here is the constructor section.
    var myType = function () {
        var N = {}, // Enclosed (private) members are here.
            X = this; // Exposed (public) members are here.

        (function ENCLOSED_FIELDS() {
            N.toggle = false;
            N.text = '';
        }());

        (function EXPOSED_FIELDS() {
            X.count = 0;
            X.numbers = [1, 2, 3];
        }());

        // The properties below have access to the enclosed fields.
        // Careful with functions exposed within the closure of the
        // constructor, each new instance will have it's own copy.
        (function EXPOSED_PROPERTIES_WITHIN_CONSTRUCTOR() {
            Object.defineProperty(X, 'toggle', {
                get: function () {
                    var before = N.toggle;
                    N.toggle = !N.toggle;
                    return before;
                }
            });

            Object.defineProperty(X, 'text', {
                get: function () {
                    return N.text;
                },
                set: function (value) {
                    N.text = value;
                }
            });
        }());
    };

    // Here is the prototype section.
    (function PROTOTYPE() {
        var P = myType.prototype;

        (function EXPOSED_PROPERTIES_WITHIN_PROTOTYPE() {
            Object.defineProperty(P, 'numberLength', {
                get: function () {
                    return this.numbers.length;
                }
            });
        }());

        (function EXPOSED_METHODS() {
            P.incrementNumbersByCount = function () {
                var i;
                for (i = 0; i < this.numbers.length; i++) {
                    this.numbers[i] += this.count;
                }
            };
            P.tweak = function () {
                if (this.toggle) {
                    this.count++;
                }
                this.text = 'tweaked';
            };
        }());
    }());

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

ফোল্ডিং প্যাটার্নটি এখানে সম্পূর্ণরূপে বিশদ: জাভাস্ক্রিপ্ট ফোল্ডিং প্যাটার্ন


3

@ লিয়ামম্লেকনান্নের উত্তরের জন্য কোড গল্ফ ।

var Animal = function (args) {
  return {
    name: args.name,

    getName: function () {
      return this.name; // member access
    },

    callGetName: function () {
      return this.getName(); // method call
    }
  };
};

var cat = Animal({ name: 'tiger' });
console.log(cat.callGetName());


2

MooTools (আমার অবজেক্ট ওরিয়েন্টেড সরঞ্জামসমূহ) ক্লাসগুলির ধারণাকে কেন্দ্র করে । এমনকি আপনি উত্তরাধিকার সহ প্রসারিত এবং প্রয়োগ করতে পারেন।

আয়ত্ত করা হলে এটি হাস্যকরভাবে পুনরায় ব্যবহারযোগ্য, শক্তিশালী জাভাস্ক্রিপ্ট তৈরি করে।


2

উত্তরাধিকার সহ অবজেক্ট বেসড ক্লাস

var baseObject = 
{
     // Replication / Constructor function
     new : function(){
         return Object.create(this);   
     },

    aProperty : null,
    aMethod : function(param){
      alert("Heres your " + param + "!");
    },
}


newObject = baseObject.new();
newObject.aProperty = "Hello";

anotherObject = Object.create(baseObject); 
anotherObject.aProperty = "There";

console.log(newObject.aProperty) // "Hello"
console.log(anotherObject.aProperty) // "There"
console.log(baseObject.aProperty) // null

সরল, মিষ্টি এবং 'কাজ হয়ে গেছে।


1

একটি বেস

function Base(kind) {
    this.kind = kind;
}

একটি শ্রেণী

// Shared var
var _greeting;

(function _init() {
    Class.prototype = new Base();
    Class.prototype.constructor = Class;
    Class.prototype.log = function() { _log.apply(this, arguments); }
    _greeting = "Good afternoon!";
})();

function Class(name, kind) {
    Base.call(this, kind);
    this.name = name;
}

// Shared function
function _log() {
    console.log(_greeting + " Me name is " + this.name + " and I'm a " + this.kind);
}

কর্ম

var c = new Class("Joe", "Object");
c.log(); // "Good afternoon! Me name is Joe and I'm a Object"

1

ট্রিপটিচের উদাহরণের ভিত্তিতে, এটি আরও সহজ হতে পারে:

    // Define a class and instantiate it
    var ThePerson = new function Person(name, gender) {
        // Add class data members
        this.name = name;
        this.gender = gender;
        // Add class methods
        this.hello = function () { alert('Hello, this is ' + this.name); }
    }("Bob", "M"); // this instantiates the 'new' object

    // Use the object
    ThePerson.hello(); // alerts "Hello, this is Bob"

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

এই prototypeজিনিসটি কেন ব্যবহার করে না তা দেখতে আমি এখনও জেএসের সাথে খুব নতুন ।


0

জাভাস্ক্রিপ্ট বস্তু-ভিত্তিক , তবে এটি অন্যান্য ওওপির চেয়ে একেবারে আলাদা জাভা, সি # বা সি ++ এর মতো ভাষার । এটি বুঝতে চেষ্টা করবেন না। সেই পুরানো জ্ঞানটি ফেলে দিন এবং নতুনভাবে শুরু করুন। জাভাস্ক্রিপ্টের আলাদা চিন্তাভাবনা দরকার।

আমি বিষয়টিতে একটি ভাল ম্যানুয়াল বা কিছু পাওয়ার পরামর্শ দেব। আমি নিজে এক্সট্রিজ টিউটোরিয়ালগুলি আমার জন্য সেরা খুঁজে পেয়েছি , যদিও আমি ফ্রেমওয়ার্কটি এটি পড়ার আগে বা পরে ব্যবহার করি নি। তবে এটি জাভাস্ক্রিপ্ট বিশ্বে কী কী তা সম্পর্কে একটি ভাল ব্যাখ্যা দেয়। দুঃখিত, মনে হচ্ছে যে সামগ্রীটি সরানো হয়েছে। পরিবর্তে আর্কাইভ.আর.পি কপির একটি লিঙ্ক এখানে । আজ কাজ করে। : P: P


2
অবজেক্ট ওরিয়েন্টেড? আমি এটি কার্যকরী ছিল ।
পিটার মর্টেনসেন

"ExtJS টিউটোরিয়ালস" লিঙ্কটি নষ্ট হয়ে গেছে।
পিটার মর্টেনসেন

আমি মনে করি যে জাভাস্ক্রিপ্টের ফাংশনগুলি বস্তু হিসাবে এটি ব্যাখ্যা করা আরও ব্যাখ্যাযোগ্য হবে এবং জাভাস্ক্রিপ্টের বন্ধনী-স্কোপ নিয়মগুলি প্রতিটি ফাংশনকে এনক্যাপসুলেটিং করে।
mibbit

-1

//new way using this and new
function Persons(name) {
  this.name = name;
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
  };
}

var gee=new Persons("gee");
gee.greeting();

var gray=new Persons("gray");
gray.greeting();

//old way
function createPerson(name){
 var obj={};
 obj.name=name;
 obj.greeting = function(){
 console.log("hello I am"+obj.name);
 }; 
  return obj;
}

var gita=createPerson('Gita');
gita.greeting();

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