জাভাস্ক্রিপ্টে স্থির পরিবর্তনশীল


716

আমি কীভাবে জাভাস্ক্রিপ্টে স্থির পরিবর্তনশীল তৈরি করতে পারি?


আমরা "ডিসপালি: কিছুই নয়" শৈলীর বৈশিষ্ট্য সহ লেবেল বা অন্যান্য এইচটিএমএল ট্যাগ সংজ্ঞায়িত করতে পারি এবং এই মানটির জন্য এই পরিবর্তন এবং মানটির জন্য পরিবর্তনশীল মান সেট করতে পারি। আসুন কঠোরভাবে গ্রহণ করা যাক না।
আসগর

সবচেয়ে সহজ সমাধানটি আমি পেয়েছি: ক্লাসে কোনও স্থির পরিবর্তনশীল সংজ্ঞা দেবেন না। আপনি যখন একটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করতে চান, কেবল সেখানে এটি সংজ্ঞায়িত করুন এবং তারপরে, যেমন someFunc = () => { MyClass.myStaticVariable = 1; }। তারপরে স্থির সদস্যকে ফিরিয়ে দেওয়ার জন্য কেবল একটি স্থিতিশীল পদ্ধতি তৈরি করুন, যেমন static getStatic() { return MyClass.myStaticVariable; }। তারপরে আপনি MyClass.getStatic()স্ট্যাটিক ডেটা ধরে রাখতে কেবল ক্লাসের বাইরে থেকে কল করতে পারবেন !
পিক্সেল

উত্তর:


862

আপনি যদি ক্লাস-ভিত্তিক, স্ট্যাটিকালি টাইপ করা অবজেক্ট-ভিত্তিক ভাষা (জাভা, সি ++ বা সি # এর মতো) থেকে এসে থাকেন আমি ধরে নিয়েছি যে আপনি একটি "টাইপ" এর সাথে সম্পর্কিত একটি পরিবর্তনশীল বা পদ্ধতি তৈরি করার চেষ্টা করছেন তবে কোনও উদাহরণ নয়।

কনস্ট্রাক্টর ফাংশন সহ একটি "ধ্রুপদী" পদ্ধতির ব্যবহারের উদাহরণ আপনাকে প্রাথমিক ওও জাভাস্ক্রিপ্টের ধারণাগুলি ধরতে সহায়তা করতে পারে:

function MyClass () { // constructor function
  var privateVariable = "foo";  // Private variable 

  this.publicVariable = "bar";  // Public variable 

  this.privilegedMethod = function () {  // Public Method
    alert(privateVariable);
  };
}

// Instance method will be available to all instances but only load once in memory 
MyClass.prototype.publicMethod = function () {    
  alert(this.publicVariable);
};

// Static variable shared by all instances
MyClass.staticProperty = "baz";

var myInstance = new MyClass();

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

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

staticশব্দ আপনি সহজেই কোন ক্লাসে স্ট্যাটিক বৈশিষ্ট্য অথবা পদ্ধতি নির্ধারণ করতে দেয়।

আসুন ES6 শ্রেণীর সাথে প্রয়োগ করা উপরের উদাহরণটি দেখুন:

class MyClass {
  // class constructor, equivalent to
  // the function body of a constructor
  constructor() {
    const privateVariable = 'private value'; // Private variable at the constructor scope
    this.publicVariable = 'public value'; // Public property

    this.privilegedMethod = function() {
      // Public Method with access to the constructor scope variables
      console.log(privateVariable);
    };
  }

  // Prototype methods:
  publicMethod() {
    console.log(this.publicVariable);
  }

  // Static properties shared by all instances
  static staticProperty = 'static value';

  static staticMethod() {
    console.log(this.staticProperty);
  }
}

// We can add properties to the class prototype
MyClass.prototype.additionalMethod = function() {
  console.log(this.publicVariable);
};

var myInstance = new MyClass();
myInstance.publicMethod();       // "public value"
myInstance.additionalMethod(); // "public value"
myInstance.privilegedMethod(); // "private value"
MyClass.staticMethod();             // "static value"


5
সম্ভবত privilegedMethodওওতে কোনও ব্যক্তিগত পদ্ধতির সমতুল্য নয় কারণ মনে হচ্ছে এটি মাইক্লাসের উদাহরণে ডাকা যেতে পারে? আপনি কি এটির অধিকার পেয়েছেন বলে এটি অ্যাক্সেস করতে পারে privateVariable?
ডোনাল

3
this.constructor"উদাহরণ পদ্ধতিগুলি" থেকে স্থিতিশীল ভেরিয়েবলগুলি অ্যাক্সেস করতে ব্যবহার করা যাবে না ? যদি হ্যাঁ, তবে এটির উত্তরে এটি যুক্তিযুক্ত।
সিরো সান্তিলি 冠状 病毒 审查 六四 事件 法轮功

1
আপনি আপনার উদাহরণে স্থির ফাংশনগুলিও উল্লেখ করতে পারেন ।
ডেভিড রডরিগস

18
হাই, আমি নিশ্চিত নই যে আমি এই লাইনটির সাথে একমত / // স্ট্যাটিক ভেরিয়েবল সমস্ত দৃষ্টান্ত 'MyClass.staticProperty = "baz" দ্বারা ভাগ করা হয়েছে;' হিসেবে আমাকে যে infers আপনি 'myInstance.staticProperty' থেকে বায খুঁজে পেতে পারে যা অবশ্যই তুমি পারবে না।
ফুলস্ট্যাকলাইফ

5
সম্ভবত এটি MyClass.prototype.staticProperty = "baz";OO নীতিগুলি পড়তে বা আরও সঠিক হওয়া উচিত স্থিতিশীল সম্পত্তিটি একটি বেনাম ফাংশন হিসাবে সংজ্ঞায়িত করা উচিত MyClass.prototype.staticProperty = function () {return staticVar;}এবং যাতে সমস্ত দৃষ্টান্তগুলি একটি একক ভেরিয়েবল অ্যাক্সেস করে যা একটি সেটারের সাথেও পরিবর্তিত হতে পারে।
lindsaymacvean

535

আপনি জেএস ফাংশনগুলিও অবজেক্টের সত্যতাটি গ্রহণ করতে পারেন - যার অর্থ তাদের বৈশিষ্ট্য থাকতে পারে।

উদাহরণস্বরূপ, জাভাস্ক্রিপ্টে স্ট্যাটিক ভেরিয়েবল (এখন নিখোঁজ) নিবন্ধে দেওয়া উদাহরণ উদ্ধৃত করে :

function countMyself() {
    // Check to see if the counter has been initialized
    if ( typeof countMyself.counter == 'undefined' ) {
        // It has not... perform the initialization
        countMyself.counter = 0;
    }

    // Do something stupid to indicate the value
    alert(++countMyself.counter);
}

আপনি যদি সেই ফাংশনটিকে বেশ কয়েকবার কল করেন তবে দেখবেন যে কাউন্টারটি বাড়ানো হচ্ছে।

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


এবং বন্ধের ভিত্তিতে এখানে আরও একটি সম্ভাব্য সমাধান রয়েছে: জাভাস্ক্রিপ্টে স্থির ভেরিয়েবল ব্যবহার করার কৌশল :

var uniqueID = (function() {
   var id = 0; // This is the private persistent value
   // The outer function returns a nested function that has access
   // to the persistent value.  It is this nested function we're storing
   // in the variable uniqueID above.
   return function() { return id++; };  // Return and increment
})(); // Invoke the outer function after defining it.

যা আপনাকে একই ধরণের ফলাফল দেয় - বাদে, বারের পরিবর্তিত মানটি প্রদর্শিত পরিবর্তে ফিরে আসবে।


50
একটি শর্টকাট হিসাবে, আপনি কেবল countMyself.counter = countMyself.counter || initial_value;তখনই করতে পারেন যদি স্থির পরিবর্তনশীলটি কখনও মিথ্যা হয়ে যায় না (মিথ্যা, 0, নাল, বা খালি স্ট্রিং)
কিপ

3
সামান্য খাটো এবং পরিষ্কার: (ফাংশন () {var id = 0; ফাংশন ইউনিকআইডি () {রিটার্ন আইডি ++;};}) ();
টম রবিনসন

3
ফায়ারফক্সের ক্লাসের তুলনায় ক্লোজারে কাউন্টারটি খুব দ্রুত। jsperf.com/static-counter-in-class-vs-in-closure
সনি

অন্য চেকগুলির ===জন্য ব্যবহার করুন typeofআপনি কিছু অদ্ভুত জবরদস্তি চালিয়ে যাবেন।
শিশির

@ সনিস্যান্টোস আপনার পরীক্ষাটি ফায়ারফক্স 40
বার্তোলো-ওট্রিট

96

আপনি এটি একটি আইআইএফই (অবিলম্বে অনুরোধ ফাংশন এক্সপ্রেশন) এর মাধ্যমে করেন:

var incr = (function () {
    var i = 1;

    return function () {
        return i++;
    }
})();

incr(); // returns 1
incr(); // returns 2

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

1
আমি কেবল 'আইআইএফই' না দিয়ে 'ক্লোজার' ব্যবহার করে পুনরায় প্রতিবেদন করব।
zendka

39

আপনি "স্ট্যাটিক" ভেরিয়েবলগুলি সংরক্ষণ করতে আর্গুমেন্টস ক্যালি ব্যবহার করতে পারেন (এটি বেনামে ফাংশনেও কার্যকর):

function () {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 1;
  arguments.callee.myStaticVar++;
  alert(arguments.callee.myStaticVar);
}

3
যতদূর আমি বুঝতে পারি, প্যাস্কেল মার্টিনের পথে এই পদ্ধতির একটি (কেবল একটি?) সুবিধা রয়েছে: আপনি এটি বেনাম ফাংশনে ব্যবহার করতে পারেন। এর উদাহরণটি দুর্দান্ত হবে
ড্যান

27
arguments.calleeঅবচয় করা হয়।
কোলোনেল প্রশ্ন

আমি বেশিরভাগ সময় জেএসকে উপহাস করি, তবে calleeমনে হয় এটি একটি সুন্দর জিনিস। আমি ভাবছি কেন হ্যাক তারা এটিকে অবমূল্যায়নের সিদ্ধান্ত নিয়েছিল ...: |
ব্যবহারকারী 2173353

34

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

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

এটি আপনার প্রশ্নের উত্তরও দেয়:

function Podcast() {

    // private variables
    var _somePrivateVariable = 123;

    // object properties (read/write)
    this.title = 'Astronomy Cast';
    this.description = 'A fact-based journey through the galaxy.';
    this.link = 'http://www.astronomycast.com';

    // for read access to _somePrivateVariable via immutableProp 
    this.immutableProp = function() {
        return _somePrivateVariable;
    }

    // object function
    this.toString = function() {
       return 'Title: ' + this.title;
    }
};

// static property
Podcast.FILE_EXTENSION = 'mp3';
// static function
Podcast.download = function(podcast) {
    console.log('Downloading ' + podcast + ' ...');
};

সেই উদাহরণটি দেওয়া, আপনি স্থির বৈশিষ্ট্য / ফাংশনটি নীচের হিসাবে অ্যাক্সেস করতে পারেন :

// access static properties/functions
console.log(Podcast.FILE_EXTENSION);   // 'mp3'
Podcast.download('Astronomy cast');    // 'Downloading Astronomy cast ...'

এবং অবজেক্টের বৈশিষ্ট্য / ফাংশন কেবল এইভাবে :

// access object properties/functions
var podcast = new Podcast();
podcast.title = 'The Simpsons';
console.log(podcast.toString());       // Title: The Simpsons
console.log(podcast.immutableProp());  // 123

নোট করুন যে পডকাস্ট.আইমুট্যাবলপ্রপ () এ, আমাদের একটি বন্ধ রয়েছে : _সোমপ্রাইভেটে ভেরিয়েবলের রেফারেন্সটি ফাংশনের ভিতরে রাখা হয়েছে।

এমনকি আপনি গেটার এবং সেটটারগুলি সংজ্ঞায়িত করতে পারেন । এই কোড স্নিপেটটি একবার দেখুন ( dঅবজেক্টটির প্রোটোটাইপটি যেখানে আপনি একটি সম্পত্তি ঘোষণা করতে চান, yএটি একটি ব্যক্তিগত ভেরিয়েবল যা নির্মাণকারীর বাইরে দৃশ্যমান নয়):

// getters and setters
var d = Date.prototype;
Object.defineProperty(d, "year", {
    get: function() {return this.getFullYear() },
    set: function(y) { this.setFullYear(y) }
});

এটি সম্পত্তি এবং ফাংশনগুলির d.yearমাধ্যমে সংজ্ঞা দেয় - যদি আপনি নির্দিষ্ট না করেন তবে সম্পত্তিটি কেবল পঠনযোগ্য এবং পরিবর্তিত হতে পারে না (সচেতন হন যদি আপনি সেট করার চেষ্টা করেন তবে ত্রুটি পাবেন না তবে এর কোনও প্রভাব নেই)। প্রতিটি সম্পত্তির বৈশিষ্ট্য রয়েছে , (ঘোষণার পরে পরিবর্তনের অনুমতি দিন) এবং (এটি গণক হিসাবে ব্যবহার করার অনুমতি দিন), যা প্রতি ডিফল্ট থাকে । আপনি তাদের তৃতীয় প্যারামিটারের মাধ্যমে সেট করতে পারেন , যেমন ।getsetsetwritableconfigurableenumerablefalsedefinePropertyenumerable: true

যা বৈধ তা এই বাক্য গঠন:

// getters and setters - alternative syntax
var obj = { a: 7, 
            get b() {return this.a + 1;}, 
            set c(x) {this.a = x / 2}
        };

যা একটি পঠনযোগ্য / লিখনযোগ্য সম্পত্তি a, একটি পঠনযোগ্য সম্পত্তি bএবং কেবলমাত্র লিখনযোগ্য সম্পত্তিকে সংজ্ঞায়িত করে c, যার মাধ্যমে সম্পত্তি aঅ্যাক্সেস করা যায়।

ব্যবহার:

console.log(obj.a); console.log(obj.b); // output: 7, 8
obj.c=40;
console.log(obj.a); console.log(obj.b); // output: 20, 21

মন্তব্য:

আপনি newকীওয়ার্ডটি ভুলে গেছেন সে ক্ষেত্রে অপ্রত্যাশিত আচরণ এড়াতে , আমি আপনাকে ফাংশনটিতে নিম্নলিখিতটি যুক্ত করার পরামর্শ দিচ্ছি Podcast:

// instantiation helper
function Podcast() {
    if(false === (this instanceof Podcast)) {
        return new Podcast();
    }
// [... same as above ...]
};

এখন নিম্নলিখিত দুটি ইনস্ট্যান্টেশন প্রত্যাশার মতো কাজ করবে:

var podcast = new Podcast(); // normal usage, still allowed
var podcast = Podcast();     // you can omit the new keyword because of the helper

'নতুন' বিবৃতিটি একটি নতুন অবজেক্ট তৈরি করে এবং সমস্ত বৈশিষ্ট্য এবং পদ্ধতিগুলি অনুলিপি করে

var a=new Podcast();
var b=new Podcast();
a.title="a"; b.title="An "+b.title;
console.log(a.title); // "a"
console.log(b.title); // "An Astronomy Cast"

আরও মনে রাখবেন, কিছু পরিস্থিতিতে কাস্ট্রার অভ্যন্তরীণভাবে নির্ভর করে এমন একটি কাস্টম অবজেক্ট সুরক্ষিত ফাংশন ফিরিয়ে returnআনতে কনস্ট্রাক্টর ফাংশনে স্টেটমেন্টটি ব্যবহার করা কার্যকর হতে পারে Podcastতবে যা প্রকাশ করা দরকার। এটি নিবন্ধ সিরিজের দ্বিতীয় অধ্যায় (বিষয়গুলি) এ আরও ব্যাখ্যা করা হয়েছে।

আপনি এটি বলতে পারেন aএবং bউত্তরাধিকারী হতে পারেন Podcast। এখন, আপনি যদি পডকাস্টে এমন কোনও পদ্ধতি যুক্ত করতে চান যা তাদের সকলের পরে প্রযোজ্য হয় aএবং bইনস্ট্যান্ট করা হয়েছে? এই ক্ষেত্রে, .prototypeনিম্নলিখিত হিসাবে ব্যবহার করুন :

Podcast.prototype.titleAndLink = function() {
    return this.title + " [" + this.link + "]";
};

এখন কল করুন aএবং bআবার

console.log(a.titleAndLink()); // "a [http://www.astronomycast.com]"
console.log(b.titleAndLink()); // "An Astronomy Cast [http://www.astronomycast.com]"

প্রোটোটাইপগুলি সম্পর্কে আরও বিশদ এখানে পাবেন । আপনি আরো উত্তরাধিকার কাজ করতে চান তবে আমি দৃষ্টিপাত করার পরামর্শ দিই এই


নিবন্ধ সিরিজ আমি পূর্বেই উল্লেখ করা করেছি অত্যন্ত বাঞ্ছনীয় পড়তে, তারা নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত:

  1. ক্রিয়াকলাপ
  2. অবজেক্টস
  3. এগুলির নমুনা
  4. কনস্ট্রাক্টর ফাংশনগুলিতে নতুন প্রয়োগ করা
  5. উত্তোলন
  6. স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ
  7. স্ট্যাটিক বৈশিষ্ট্য এবং পদ্ধতি

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

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

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

আপনি যদি জাভাস্ক্রিপ্টে সি # outপরামিতিগুলি (যেমন এর মতো DateTime.TryParse(str, out result)) অনুকরণ করতে চান তা জানতে চাইলে আপনি এখানে নমুনা কোডটি সন্ধান করতে পারেন


আপনারা যারা IE এর সাথে কাজ করছেন (যা জাভাস্ক্রিপ্টের জন্য কোন কনসোল নেই আপনি যদি বিকাশকারী সরঞ্জামগুলি ব্যবহার F12না করে কনসোল ট্যাবটি না খোলেন) নীচের স্নিপেটটি দরকারী বলে মনে হতে পারে। এটি আপনাকে console.log(msg);উপরের উদাহরণগুলিতে ব্যবহৃত হিসাবে ব্যবহার করতে দেয় । Podcastফাংশনের আগে এটি সন্নিবেশ করান ।

আপনার সুবিধার জন্য, এখানে একটি সম্পূর্ণ সিঙ্গল কোড স্নিপেটে উপরের কোডটি রয়েছে:


মন্তব্য:

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

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

  • জাভাস্ক্রিপ্টে স্থানীয় ভেরিয়েবল, ফাংশন ইত্যাদির এনক্যাপসুলেশন অর্জনের জন্য, আমি নিম্নলিখিতগুলির মতো একটি প্যাটার্ন ব্যবহার করার পরামর্শ দিচ্ছি (জ্যাকুয়ারি একই কৌশল ব্যবহার করে):

<html>
<head></head>
<body><script>
    'use strict';
    // module pattern (self invoked function)
    const myModule = (function(context) { 
    // to allow replacement of the function, use 'var' otherwise keep 'const'

      // put variables and function with local module scope here:
      var print = function(str) {
        if (str !== undefined) context.document.write(str);
        context.document.write("<br/><br/>");
        return;
      }
      // ... more variables ...

      // main method
      var _main = function(title) {

        if (title !== undefined) print(title);
        print("<b>last modified:&nbsp;</b>" + context.document.lastModified + "<br/>");        
        // ... more code ...
      }

      // public methods
      return {
        Main: _main
        // ... more public methods, properties ...
      };

    })(this);

    // use module
    myModule.Main("<b>Module demo</b>");
</script></body>
</html>

অবশ্যই, আপনি - এবং করা উচিত - একটি পৃথক *.jsফাইলে স্ক্রিপ্ট কোড লাগাতে পারেন ; উদাহরণটি ছোট রাখার জন্য এটি কেবল ইনলাইনে লেখা।

স্ব-আমন্ত্রণমূলক ক্রিয়াকলাপগুলি (আইআইএফই = তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন হিসাবেও পরিচিত) এখানে আরও বিশদে বর্ণনা করা হয়েছে


28
function Person(){
  if(Person.count == undefined){
    Person.count = 1;
  }
  else{
    Person.count ++;
  }
  console.log(Person.count);
}

var p1 = new Person();
var p2 = new Person();
var p3 = new Person();

28

আপডেট উত্তর:

ইন নাম ECMAScript 6 , আপনি ব্যবহার স্ট্যাটিক ফাংশন তৈরি করতে পারেন staticমূলশব্দ:

class Foo {

  static bar() {return 'I am static.'}

}

//`bar` is a property of the class
Foo.bar() // returns 'I am static.'

//`bar` is not a property of instances of the class
var foo = new Foo()
foo.bar() //-> throws TypeError

ES6 ক্লাস স্ট্যাটিক্সের জন্য কোনও নতুন শব্দার্থবিজ্ঞানের পরিচয় দেয় না। আপনি ES5 এ একই জিনিস করতে পারেন:

//constructor
var Foo = function() {}

Foo.bar = function() {
    return 'I am static.'
}

Foo.bar() // returns 'I am static.'

var foo = new Foo()
foo.bar() // throws TypeError

আপনি একটি সম্পত্তি বরাদ্দ করতে পারেন Fooকারণ জাভাস্ক্রিপ্ট ফাংশন অবজেক্টস।


Foo.bar;এতে আপনার দ্বারা নির্ধারিত ফাংশনটি প্রদান করে, আপনার মন্তব্যে বোঝা যাচ্ছে না যে ফাংশনটি দিয়ে স্ট্রিং ফিরিয়েছে।

এই দুটি উদাহরণে আপনি কীভাবে স্থিতিশীল মান (ওভাররাইট) সেট করবেন সে সম্পর্কে কিছু তথ্য যুক্ত করতে পারেন?
উইল্ট

1
@ উভয় ক্ষেত্রেই, "স্ট্যাটিক" বৈশিষ্ট্যটি ফাংশনটিতে কেবল একটি সম্পত্তি, সুতরাং আপনি এটি সেট করুন এবং জাভাস্ক্রিপ্টে অন্য কোনও সম্পত্তি যেমন ঠিক তেমন এটি মুছে ফেলুন। উভয় ক্ষেত্রেই, আপনি সেট করতে পারেন barসম্পত্তির Fooকরতে 3: এটি পছন্দFoo.bar = 3;
ম্যাক্স Heiber


16

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

(function () {
    var name = '';
    Person = function (value) {
        name = value;
    };
    Person.prototype.getName = function () {
        return name;
    };
    Person.prototype.setName = function (value) {
        name = value;
    };
}());
var person1 = new Person('Nate');
console.log(person1.getName()); // Nate
person1.setName('James');
console.log(person1.getName()); // James
person1.name = 'Mark';
console.log(person1.name); // Mark
console.log(person1.getName()); // James
var person2 = new Person('Danielle');
console.log(person1.getName()); // Danielle
console.log(person2.getName()); // Danielle

Personএই উদাহরণে কন্সট্রাকটর হিসেবে ব্যক্তিগত পরিবর্তনশীল নাম ব্যবহার করেছে, getName()এবং setName()পদ্ধতি। এই প্যাটার্নটি ব্যবহার করে, নাম পরিবর্তনশীল স্থির হয়ে যায় এবং সমস্ত দৃষ্টান্তের মধ্যে ব্যবহৃত হবে। এর অর্থ হ'ল setName()এক মুহূর্তে কল করা অন্য সমস্ত দৃষ্টান্তগুলিকে প্রভাবিত করে। কল করা setName()বা একটি নতুন Personউদাহরণ তৈরি করা নামটি ভেরিয়েবলটিকে একটি নতুন মান হিসাবে সেট করে। এর ফলে সমস্ত দৃষ্টান্ত একই মান ফেরত দেয়।


কনস্ট্রাক্টর + প্রোটোটাইপ (সংকর) দেখায়
গণেশ কুমার

2
এটি পার্সোন অবজেক্টকে বিশ্বব্যাপী নেমস্পেসে রাখে। কোনও সমাধান নয় যা আমি সুপারিশ করব।
ঘোলা

আমি মনে করি না এটি একটি সত্য স্থিতিশীল পরিবর্তনশীল কারণ এটি প্রতিটি নতুন বস্তুর সাথে পৃথকভাবে ইনস্ট্যান্ট করা হয়। একটি স্ট্যাটিক অবজেক্ট প্যারেন্ট প্রোটোটাইপ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত অবজেক্টের সাথে সামঞ্জস্য হওয়া উচিত?
lindsaymacvean

1
@ ঘোলা এখানে উদ্দেশ্য ছিল কীভাবে একটি স্ট্যাটিক ভেরিয়েবল তৈরি করবেন তা ব্যাখ্যা করা। সঠিক নামকরণ এবং গ্লোবালগুলি এড়ানো এগুলি একটি পৃথক বিষয় যা উত্তরের জটিলতায় যুক্ত হতে পারে। দূষণ না করে কীভাবে কনস্ট্রাক্টর সংযুক্ত করবেন তা নির্ধারণ করা এটি ব্যবহারকারীর উপর নির্ভর করে। যদি নিকোলাস জাকাসের পক্ষে এটি যথেষ্ট ভাল হয় তবে এটি আমার পক্ষে যথেষ্ট ভাল।
নট

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

15

আপনি যদি নতুন শ্রেণীর সিনট্যাক্স ব্যবহার করেন তবে আপনি এখন নিম্নলিখিতটি করতে পারেন:

    class MyClass {
      static get myStaticVariable() {
        return "some static variable";
      }
    }

    console.log(MyClass.myStaticVariable);

    aMyClass = new MyClass();
    console.log(aMyClass.myStaticVariable, "is undefined");

এটি কার্যকরভাবে জাভাস্ক্রিপ্টে একটি স্ট্যাটিক পরিবর্তনশীল তৈরি করে।


স্ট্যাটিক ইউটিলিটি ক্লাস তৈরি করার সময় এটি দরকারী!
o

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


8

আপনি যদি আপনার অ্যাপ্লিকেশনটিতে ধ্রুবক তৈরির জন্য স্থিতিশীল ভেরিয়েবলগুলি ঘোষণা করতে চান তবে আমি নিম্নলিখিতটিকে সাদামাটা পদ্ধতির হিসাবে অনুসরণ করেছি

ColorConstants = (function()
{
    var obj = {};
    obj.RED = 'red';
    obj.GREEN = 'green';
    obj.BLUE = 'blue';
    obj.ALL = [obj.RED, obj.GREEN, obj.BLUE];
    return obj;
})();

//Example usage.
var redColor = ColorConstants.RED;

8

classECMAScript 2015 দ্বারা চালু করা সম্পর্কে । অন্যান্য উত্তরগুলি সম্পূর্ণ পরিষ্কার নয়।

এখানে দেখানো একটি স্ট্যাটিক Var তৈরি করার পদ্ধতি একটি উদাহরণ staticVarদিয়ে ClassNamevarsynthax:

class MyClass {
    constructor(val) {
        this.instanceVar = val;
        MyClass.staticVar = 10;
    }
}

var class1 = new MyClass(1);
console.log(class1.instanceVar);      // 1
console.log(class1.constructor.staticVar); // 10

// New instance of MyClass with another value
var class2 = new MyClass(3);
console.log(class1.instanceVar);      // 1
console.log(class2.instanceVar);      // 3

স্ট্যাটিক ভেরিয়েবল অ্যাক্সেসের জন্য আমরা সেই .constructorসম্পত্তিটি ব্যবহার করি যা ক্লাস তৈরি করা অবজেক্ট কনস্ট্রাক্টর ফাংশনটির একটি রেফারেন্স দেয় returns আমরা এটি দুটি নির্মিত উদাহরণে কল করতে পারি:

MyClass.staticVar = 11;
console.log(class1.constructor.staticVar); // 11
console.log(class2.constructor.staticVar); // 11 <-- yes it's static! :)

MyClass.staticVar = 12;
console.log(class1.constructor.staticVar); // 12
console.log(class2.constructor.staticVar); // 12

7

অন্যান্য অনুরূপ উত্তর আছে, কিন্তু তাদের মধ্যে কেউই আমার কাছে যথেষ্ট আবেদন করেনি। আমি এখানে যা শেষ করেছি তা এখানে:

var nextCounter = (function () {
  var counter = 0;
  return function() {
    var temp = counter;
    counter += 1;
    return temp;
  };
})();

7

বাকীগুলি ছাড়াও, বর্তমানে ইসিএমএ প্রস্তাবসমূহের উপর একটি খসড়া ( পর্যায় -২ প্রস্তাব ) রয়েছে যা ক্লাসে পাবলিক ক্ষেত্রগুলি প্রবর্তন করে । ( ব্যক্তিগত ক্ষেত্র বিবেচনা করা হয়েছিল )static

প্রস্তাবনা থেকে উদাহরণ ব্যবহার করে, প্রস্তাবিত staticবাক্য গঠনটি দেখতে পাবেন:

class CustomDate {
  // ...
  static epoch = new CustomDate(0);
}

এবং অন্যেরা হাইলাইট করেছেন এমন নীচের সমতুল্য হোন:

class CustomDate {
  // ...
}
CustomDate.epoch = new CustomDate(0);

তারপরে আপনি এটির মাধ্যমে অ্যাক্সেস করতে পারবেন CustomDate.epoch

আপনি নতুন প্রস্তাবটি ট্র্যাক করে রাখতে পারেন proposal-static-class-features


বর্তমানে, ব্যাবেল এই বৈশিষ্ট্যটিকে ট্রান্সফর্ম শ্রেণীর বৈশিষ্ট্য প্লাগইন সমর্থন করে যা আপনি ব্যবহার করতে পারেন supports অতিরিক্তভাবে, যদিও এখনও চলছে, V8এটি বাস্তবায়ন করছে


6

আপনি নীচের মত জাভাস্ক্রিপ্ট একটি স্থিতিশীল পরিবর্তনশীল তৈরি করতে পারেন। এখানে countস্থির পরিবর্তনশীল।

var Person = function(name) {
  this.name = name;
  // first time Person.count is undefined, so it is initialized with 1
  // next time the function is called, the value of count is incremented by 1
  Person.count = Person.count ? Person.count + 1 : 1;
}

var p1 = new Person('User p1');
console.log(p1.constructor.count);   // prints 1
var p2 = new Person('User p2');
console.log(p2.constructor.count);   // prints 2

আপনি Personফাংশন, বা কোনও উদাহরণ ব্যবহার করে স্ট্যাটিক ভেরিয়েবলের মান নির্ধারণ করতে পারেন :

// set static variable using instance of Person
p1.constructor.count = 10;         // this change is seen in all the instances of Person
console.log(p2.constructor.count); // prints 10

// set static variable using Person
Person.count = 20;
console.log(p1.constructor.count); // prints 20

স্থিতিশীল ভেরিয়েবল ঘোষণা এবং এটি জাভাস্ক্রিপ্টে অ্যাক্সেস করার জন্য এটি একটি ভাল পদ্ধতির।
অরুণধ্বজ IIITH

5

আপনি যদি বিশ্বব্যাপী স্ট্যাটিক পরিবর্তনশীল করতে চান:

var my_id = 123;

ভেরিয়েবলটি নীচের সাথে প্রতিস্থাপন করুন:

Object.defineProperty(window, 'my_id', {
    get: function() {
            return 123;
        },
    configurable : false,
    enumerable : false
});

4

স্ট্যাটিক ভেরিয়েবলের জাভাস্ক্রিপ্টের নিকটতম জিনিসটি একটি বিশ্বব্যাপী পরিবর্তনশীল - এটি কেবল কোনও ফাংশন বা অবজেক্ট আক্ষরিকের স্কোপের বাইরে ঘোষিত ভেরিয়েবল:

var thisIsGlobal = 1;

function foo() {
    var thisIsNot = 2;
}

আপনি যে জিনিসটি করতে পারেন তা হ'ল বৈশ্বিক ভেরিয়েবলগুলিকে এই জাতীয় বস্তুর অভ্যন্তরে সংরক্ষণ করতে হবে:

var foo = { bar : 1 }

এবং তারপরে এর মতো ভেরিয়েবলগুলি অ্যাক্সেস করুন : foo.bar.


এটি আমাকে একাধিক ফাইল আপলোড করতে সহায়তা করেছে ..... var foo = {কাউন্টার: 1}; ফাংশন আরও ফাইল () {fileName = "ফাইল" + foo.counter; foo.counter = foo.counter + 1;
veer7

4

এখানে সমস্ত শ্রেণীর ধারণাকে ঘনীভূত করতে, এটি পরীক্ষা করুন:

var Test = function() {
  // "super private" variable, accessible only here in constructor. There are no real private variables
  //if as 'private' we intend variables accessible only by the class that defines the member and NOT by child classes
  var test_var = "super private";

  //the only way to access the "super private" test_var is from here
  this.privileged = function(){
    console.log(test_var);
  }();

  Test.test_var = 'protected';//protected variable: accessible only form inherited methods (prototype) AND child/inherited classes

  this.init();
};//end constructor

Test.test_var = "static";//static variable: accessible everywhere (I mean, even out of prototype, see domready below)

Test.prototype = {

 init:function(){
   console.log('in',Test.test_var);
 }

};//end prototype/class


//for example:
$(document).ready(function() {

 console.log('out',Test.test_var);

 var Jake = function(){}

 Jake.prototype = new Test();

 Jake.prototype.test = function(){
   console.log('jake', Test.test_var);
 }

 var jake = new Jake();

 jake.test();//output: "protected"

});//end domready

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

#this is coffeescript
class Test
 #static
 @prop = "static"

 #instance
 constructor:(prop) ->
   @prop = prop
   console.log(@prop)

 t = new Test('inst_prop');

 console.log(Test.prop);


//this is how the above is translated in plain js by the CS compiler
  Test = (function() {
    Test.prop = "static";

    function Test(prop) {
     this.prop = prop;
     console.log(this.prop);
    }

    return Test;

  })();

  t = new Test('inst_prop');

  console.log(Test.prop);

4

জাভাস্ক্রিপ্টে ভেরিয়েবলগুলি ডিফল্টরূপে স্থির থাকেউদাহরণ :

var x = 0;

function draw() {
    alert(x); //
    x+=1;
}

setInterval(draw, 1000);

X এর মান প্রতি 1000 মিলি সেকেন্ডে 1 দ্বারা বাড়ানো হয়
এটি 1,2,3 প্রিন্ট করবে forth


2
এটি অন্যরকম ঘটনা। আপনার উদাহরণটি স্কোপগুলি সম্পর্কে।
চ্যালেট

4

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

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

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

"সেশনসটোরেজ.মিডাটা = কোনও কিছু" হিসাবে সহজেই অ্যাক্সেস করা হয়েছে এবং একইভাবে পুনরুদ্ধার করা হয়েছে। "জাভাস্ক্রিপ্ট: ডেফিনিটিভ গাইড, ষষ্ঠ সংস্করণ", ডেভিড ফ্লানাগান, আইএসবিএন: 978-0-596-80552-4, অধ্যায় 20, বিভাগ 20.1 দেখুন। এটি সাধারণ অনুসন্ধানের মাধ্যমে বা আপনার ও'রিলি সাফারিবুকস সাবস্ক্রিপশনে (স্বর্ণের ওজন অনুসারে) সহজেই পিডিএফ হিসাবে সহজেই ডাউনলোডযোগ্য।


2

ফাংশন / ক্লাসগুলি তার অবজেক্ট স্কোপের জন্য কেবলমাত্র একক নির্মাণকারীকে মঞ্জুরি দেয়। Function Hoisting, declarations & expressions

  • ফাংশন কনস্ট্রাক্টরের সাথে তৈরি ফাংশনগুলি তাদের নির্মাণের প্রসঙ্গে ক্লোজার তৈরি করে না; এগুলি সর্বদা বিশ্বব্যাপী তৈরি হয়।

      var functionClass = function ( ) {
            var currentClass = Shape;
            _inherits(currentClass, superClass);
            function functionClass() { superClass.call(this); // Linking with SuperClass Constructor.
                // Instance Variables list.
                this.id = id;   return this;
            }
        }(SuperClass)

বন্ধ - ক্লোজারের অনুলিপিগুলি সংরক্ষিত ডেটা সহ ফাংশন করে।

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

      function closureFun( args ) {
            // Local variable that ends up within closure
            var num = args;
            num++;
            return function() { console.log(num); }
        }
        var closure1 = closureFun( 5 );
        var closure2 = closureFun( 777 );
        closure1(); // 5
        closure2(); // 777
        closure2(); // 778
        closure1(); // 6

ইএস 5 ফাংশন ক্লাস : অবজেক্ট.ডাইফাইনপ্রোপার্টি (ও, পি, অ্যাট্রিবিউটস) ব্যবহার করে

Object.defineProperty () পদ্ধতি একটি বস্তুর উপর একটি বস্তু সরাসরি একটি নতুন সম্পত্তি সংজ্ঞায়িত, অথবা মডিফাই একটি বিদ্যমান সম্পত্তি, এবং বস্তুর ফেরৎ।

`Using ব্যবহার করে কিছু পদ্ধতি তৈরি করেছেন , যাতে প্রতিটি একবার সহজেই ফাংশন ক্লাসগুলি বুঝতে পারে।

'use strict';
var Shape = function ( superClass ) {
    var currentClass = Shape;
    _inherits(currentClass, superClass); // Prototype Chain - Extends

    function Shape(id) { superClass.call(this); // Linking with SuperClass Constructor.
        // Instance Variables list.
        this.id = id;   return this;
    }
    var staticVariablesJOSN = { "parent_S_V" : 777 };
    staticVariable( currentClass, staticVariablesJOSN );

    // Setters, Getters, instanceMethods. [{}, {}];
    var instanceFunctions = [
        {
            key: 'uniqueID',
            get: function get() { return this.id; },
            set: function set(changeVal) { this.id = changeVal; }
        }
    ];
    instanceMethods( currentClass, instanceFunctions );

    return currentClass;
}(Object);

var Rectangle = function ( superClass ) {
    var currentClass = Rectangle;

    _inherits(currentClass, superClass); // Prototype Chain - Extends

    function Rectangle(id, width, height) { superClass.call(this, id); // Linking with SuperClass Constructor.

        this.width = width;
        this.height = height;   return this;
    }

    var staticVariablesJOSN = { "_staticVar" : 77777 };
    staticVariable( currentClass, staticVariablesJOSN );

    var staticFunctions = [
        {
            key: 'println',
            value: function println() { console.log('Static Method'); }
        }
    ];
    staticMethods(currentClass, staticFunctions);

    var instanceFunctions = [
        {
            key: 'setStaticVar',
            value: function setStaticVar(staticVal) {
                currentClass.parent_S_V = staticVal;
                console.log('SET Instance Method Parent Class Static Value : ', currentClass.parent_S_V);
            }
        }, {
            key: 'getStaticVar',
            value: function getStaticVar() {
                console.log('GET Instance Method Parent Class Static Value : ', currentClass.parent_S_V);
                return currentClass.parent_S_V;
            }
        }, {
            key: 'area',
            get: function get() {
                console.log('Area : ', this.width * this.height);
                return this.width * this.height;
                }
        }, {
            key: 'globalValue',
            get: function get() {
                console.log('GET ID : ', currentClass._staticVar);
                return currentClass._staticVar;
            },
            set: function set(value) {
                currentClass._staticVar = value;
                console.log('SET ID : ', currentClass._staticVar);
            }
        }
    ];
    instanceMethods( currentClass, instanceFunctions );

    return currentClass;
}(Shape);

// ===== ES5 Class Conversion Supported Functions =====
function defineProperties(target, props) {
    console.log(target, ' : ', props);
    for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
    }
}
function staticMethods( currentClass, staticProps ) {
    defineProperties(currentClass, staticProps);
};
function instanceMethods( currentClass, protoProps ) {
    defineProperties(currentClass.prototype, protoProps);
};
function staticVariable( currentClass, staticVariales ) {
    // Get Key Set and get its corresponding value.
    // currentClass.key = value;
    for( var prop in staticVariales ) {
        console.log('Keys : Values');
        if( staticVariales.hasOwnProperty( prop ) ) {
            console.log(prop, ' : ', staticVariales[ prop ] );
            currentClass[ prop ] = staticVariales[ prop ];
        }
    }
};
function _inherits(subClass, superClass) {
    console.log( subClass, ' : extends : ', superClass );
    if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
    }
    subClass.prototype = Object.create(superClass && superClass.prototype, 
            { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
    if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}

কোড স্নিপেটের নীচে পরীক্ষা করতে হয় প্রতিটি দৃষ্টান্তে তাদের নিজস্ব অনুলিপি সদস্যদের এবং সাধারণ স্থিতিশীল সদস্যদের থাকে।

var objTest = new Rectangle('Yash_777', 8, 7);
console.dir(objTest);

var obj1 = new Rectangle('R_1', 50, 20);
Rectangle.println(); // Static Method
console.log( obj1 );    // Rectangle {id: "R_1", width: 50, height: 20}
obj1.area;              // Area :  1000
obj1.globalValue;       // GET ID :  77777
obj1.globalValue = 88;  // SET ID :  88
obj1.globalValue;       // GET ID :  88  

var obj2 = new Rectangle('R_2', 5, 70);
console.log( obj2 );    // Rectangle {id: "R_2", width: 5, height: 70}
obj2.area;              // Area :  350    
obj2.globalValue;       // GET ID :  88
obj2.globalValue = 999; // SET ID :  999
obj2.globalValue;       // GET ID :  999

console.log('Static Variable Actions.');
obj1.globalValue;        // GET ID :  999

console.log('Parent Class Static variables');
obj1.getStaticVar();    // GET Instance Method Parent Class Static Value :  777
obj1.setStaticVar(7);   // SET Instance Method Parent Class Static Value :  7
obj1.getStaticVar();    // GET Instance Method Parent Class Static Value :  7

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

বাক্য গঠন:

   this.constructor.staticfunctionName();
class MyClass {
    constructor() {}
    static staticMethod() {
        console.log('Static Method');
    }
}
MyClass.staticVar = 777;

var myInstance = new MyClass();
// calling from instance
myInstance.constructor.staticMethod();
console.log('From Inside Class : ',myInstance.constructor.staticVar);

// calling from class
MyClass.staticMethod();
console.log('Class : ', MyClass.staticVar);

ES6 শ্রেণি: ES2015 ক্লাসগুলি প্রোটোটাইপ-ভিত্তিক ওও প্যাটার্নের তুলনায় একটি সাধারণ চিনি। একটি একক সুবিধাজনক ঘোষিত ফর্ম থাকা শ্রেণি নিদর্শনগুলি ব্যবহার করা সহজ করে তোলে এবং আন্তঃব্যবযোগিতাটিকে উত্সাহ দেয়। ক্লাসগুলি প্রোটোটাইপ-ভিত্তিক উত্তরাধিকার, সুপার কল, উদাহরণ এবং স্থির পদ্ধতি এবং নির্মাতাকে সমর্থন করে।

উদাহরণ : আমার আগের পোস্টটি উল্লেখ করুন।


2

জাভাস্ক্রিপ্টে ফাংশন-স্থানীয় স্ট্যাটিক ভেরিয়েবলগুলি অনুকরণ করার 4 টি উপায় রয়েছে।

পদ্ধতি 1: ফাংশন অবজেক্টের বৈশিষ্ট্যগুলি (পুরানো ব্রাউজারগুলিতে সমর্থিত) ব্যবহার করে

function someFunc1(){
    if( !('staticVar' in someFunc1) )
        someFunc1.staticVar = 0 ;
    alert(++someFunc1.staticVar) ;
}

someFunc1() ; //prints 1
someFunc1() ; //prints 2
someFunc1() ; //prints 3

পদ্ধতি 2: একটি ক্লোজার, ভেরিয়েন্ট 1 (পুরানো ব্রাউজারগুলিতে সমর্থিত) ব্যবহার করে

var someFunc2 = (function(){
    var staticVar = 0 ;
    return function(){
        alert(++staticVar) ;
    }
})()

someFunc2() ; //prints 1
someFunc2() ; //prints 2
someFunc2() ; //prints 3

পদ্ধতি 3: একটি ক্লোজার, ভেরিয়েন্ট 2 (পুরানো ব্রাউজারগুলিতে সমর্থিত) ব্যবহার করে

var someFunc3 ;
with({staticVar:0})
    var someFunc3 = function(){
        alert(++staticVar) ;
    }

someFunc3() ; //prints 1
someFunc3() ; //prints 2
someFunc3() ; //prints 3

পদ্ধতি 4: একটি ক্লোজার, ভেরিয়েন্ট 3 ব্যবহার করে (ইকামাস্ক্রিপ্ট 2015 এর জন্য সমর্থন প্রয়োজন)

{
    let staticVar = 0 ;
    function someFunc4(){
        alert(++staticVar) ;
    }
}

someFunc4() ; //prints 1
someFunc4() ; //prints 2
someFunc4() ; //prints 3

2

আপনি কীওয়ার্ডটি ব্যবহার করে জাভাস্ক্রিপ্টে স্থির ফাংশন সংজ্ঞায়িত করতে পারেন static:

class MyClass {
  static myStaticFunction() {
    return 42;
  }
}

MyClass.myStaticFunction(); // 42

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

class MyClass {}

MyClass.myStaticProperty = 42;

MyClass.myStaticProperty; // 42

চূড়ান্ত দ্রষ্টব্য: উত্তরাধিকার সহ স্থির বস্তু ব্যবহার সম্পর্কে সতর্কতা অবলম্বন করুন - উত্তরাধিকারসূত্রে প্রাপ্ত শ্রেণিগুলি অবজেক্টের একই অনুলিপি ভাগ করে


1

জাভাস্ক্রিপ্টে কোনও শব্দ বা কীওয়ার্ড স্ট্যাটিক নেই তবে আমরা এই জাতীয় ডেটা সরাসরি ফাংশন অবজেক্টে (অন্য কোনও বস্তুর মতো) রেখে দিতে পারি।

function f() {
    f.count = ++f.count || 1 // f.count is undefined at first
    alert("Call No " + f.count)
}

f(); // Call No 1

f(); // Call No 2

1

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

আমি নিম্নলিখিত পদ্ধতিটি নিয়ে এসেছি:

if (typeof Function.prototype.statics === 'undefined') {
  Function.prototype.statics = function(init) {
    if (!this._statics) this._statics = init ? init() : {};
    return this._statics;
  }
}

এটি সমস্ত ফাংশনগুলিতে একটি 'স্ট্যাটিক্স' পদ্ধতি যুক্ত করে (হ্যাঁ, কেবল এটি সম্পর্কে শিথিল করুন), যখন এটি ডাকা হয় তখন এটি ফাংশন অবজেক্টে একটি ফাঁকা অবজেক্ট (_ স্ট্যাটিকস) যুক্ত করবে এবং এটি ফিরিয়ে দেবে। যদি কোনও ডিআইএন ফাংশন সরবরাহ করা হয় তবে স্ট্যাটিকসগুলি ডিআইআই () ফলাফলতে সেট করা হবে।

তারপরে আপনি এটি করতে পারেন:

function f() {
  const _s = f.statics(() => ({ v1=3, v2=somefunc() });

  if (_s.v1==3) { ++_s.v1; _s.v2(_s.v1); }
} 

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


1

সারসংক্ষেপ:

ইন ES6/ ইএস 2015-তে মূল classশব্দটি একটি অনুষঙ্গী staticকীওয়ার্ড সহ চালু হয়েছিল । মনে রাখবেন যে এটি প্রোটোটাইপাল উত্তরাধিকারের মডেলের উপরে সিনট্যাকটিক চিনি যা জাভাস্ক্রিপ্ট এম্বেড করে। staticশব্দ পদ্ধতি জন্য নিম্নলিখিত পদ্ধতিতে কাজ করে:

class Dog {

  static bark () {console.log('woof');}
  // classes are function objects under the hood
  // bark method is located on the Dog function object
  
  makeSound () { console.log('bark'); }
  // makeSound is located on the Dog.prototype object

}

// to create static variables just create a property on the prototype of the class
Dog.prototype.breed = 'Pitbull';
// So to define a static property we don't need the `static` keyword.

const fluffy = new Dog();
const vicky = new Dog();
console.log(fluffy.breed, vicky.breed);

// changing the static variable changes it on all the objects
Dog.prototype.breed = 'Terrier';
console.log(fluffy.breed, vicky.breed);


2
তিনি স্ট্যাটিক ফাংশন নয়, একটি স্ট্যাটিক ভেরিয়েবল চাইছিলেন।
কনরাড হাফনার

1

আমি প্রোটোটাইপ এবং সেভাবে কাজ করেছিলাম:

class Cat extends Anima {
  constructor() {
    super(Cat.COLLECTION_NAME);
  }
}

Cat.COLLECTION_NAME = "cats";

বা একটি স্ট্যাটিক গেটর ব্যবহার:

class Cat extends Anima {
  constructor() {
    super(Cat.COLLECTION_NAME);
  }

  static get COLLECTION_NAME() {
    return "cats"
  }
}

0

উইন্ডো স্তরের ভার্সগুলি স্ট্যাটিক্সের মতো বাছাই করা এই অর্থে যে আপনি সরাসরি রেফারেন্স ব্যবহার করতে পারেন এবং এগুলি আপনার অ্যাপ্লিকেশনের সমস্ত অংশে উপলব্ধ are


3
এই জাতীয় ভার্সনের আরও ভাল বিবরণ স্থির চেয়ে বরং 'গ্লোবাল'।
প্যাট্রিক এম

0

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

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

function circle(){
}
circle.prototype.pi=3.14159

এই পদ্ধতিটি কাজ করে, তবে আপনি Function.prototype
ড্যান

@ ড্যান: এটি আমার বোঝার বিষয় এটি কেবল বৃত্তের জন্য হবে না ফাংশনটির জন্য। কমপক্ষে এটিই ক্রোম আমাকে বলার চেষ্টা করেছে: function circle() {}| circle.prototype| circle.prototype.pi = 3.14| circle.prototype| Function.prototype| Function.__proto__(যদি এটিই আপনি বোঝাতে চেয়েছিলেন)
আকতাউ

0

এমভিসি ওয়েবসাইটগুলির সাথে কাজ করা যা jQuery ব্যবহার করে, আমি নিশ্চিত করতে চাই যে পূর্ববর্তী অনুরোধটি শেষ হওয়ার পরে নির্দিষ্ট ইভেন্ট হ্যান্ডলারগুলির মধ্যে AJAX ক্রিয়াকলাপগুলি কেবল কার্যকর করা যায়। এটি অর্জনের জন্য আমি একটি "স্ট্যাটিক" jqXHR অবজেক্ট ভেরিয়েবল ব্যবহার করি।

নিম্নলিখিত বোতাম দেওয়া:

<button type="button" onclick="ajaxAction(this, { url: '/SomeController/SomeAction' })">Action!</button>

আমি আমার ক্লিক হ্যান্ডলারের জন্য সাধারণত এই জাতীয় আইআইএফই ব্যবহার করি:

var ajaxAction = (function (jqXHR) {
    return function (sender, args) {
        if (!jqXHR || jqXHR.readyState == 0 || jqXHR.readyState == 4) {
            jqXHR = $.ajax({
                url: args.url,
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify($(sender).closest('form').serialize()),
                success: function (data) {
                    // Do something here with the data.
                }
            });
        }
    };
})(null);

0

আপনি যদি প্রোটোটাইপ ব্যবহার করতে চান তবে একটি উপায় আছে

var p = function Person() {
    this.x = 10;
    this.y = 20;
}
p.prototype.counter = 0;
var person1 = new p();
person1.prototype = p.prototype;
console.log(person1.counter);
person1.prototype.counter++;
var person2 = new p();
person2.prototype = p.prototype;
console.log(person2.counter);
console.log(person1.counter);

এটি করার ফলে আপনি যে কোনও উদাহরণ থেকে কাউন্টার ভেরিয়েবল অ্যাক্সেস করতে সক্ষম হবেন এবং সম্পত্তির যে কোনও পরিবর্তন তাৎক্ষণিকভাবে প্রতিফলিত হবে !!

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