ES6 ক্লাসে স্থির স্থির ঘোষণা?


311

আমি কনস্ট্যান্টগুলিকে একটিতে প্রয়োগ করতে চাই class, কারণ সেখানেই কোডগুলিতে তাদের সনাক্ত করা বোধগম্য।

এখনও অবধি, আমি স্থিতিশীল পদ্ধতিগুলির সাথে নিম্নলিখিত কাজের সমাধান করছি:

class MyClass {
    static constant1() { return 33; }
    static constant2() { return 2; }
    // ...
}

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

ES6 ক্লাসে ধ্রুবকগুলি প্রয়োগ করার আরও ভাল উপায় কি নেই?


7
ব্যক্তিগতভাবে আমি কেবল বড় হাতের অক্ষরগুলি ব্যবহার করি এবং এগুলিকে স্পর্শ না করার জন্য নিজেকে বলি;)
দ্বিগুণ

3
@twicejr আমার মনে হয় এটি একই নয়, কারণ স্থির ভেরিয়েবলগুলি প্রথম শ্রেণীর কোনও অবজেক্টটি ইনস্ট্যান্ট না করে অ্যাক্সেস করা যায়?
লুকাস মরগান

উত্তর:


385

আপনি করতে পারেন এমন কয়েকটি জিনিস এখানে:

মডিউলconst থেকে একটি রফতানি করুন । আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনি কেবল:

export const constant1 = 33;

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

const constant1 = 33,
      constant2 = 2;
class Example {

  static get constant1() {
    return constant1;
  }

  static get constant2() {
    return constant2;
  }
}

এইভাবে, আপনার প্রথম বন্ধনী প্রয়োজন হবে না:

const one = Example.constant1;

বাবেল REPL উদাহরণ

তারপরে, আপনি যেমনটি বলেছেন, যেহেতু একটি classকোনও ক্রিয়াকলাপের জন্য কেবল সিনট্যাকটিক চিনি তাই আপনি কেবল এইরকম একটি লিখিত-অযোগ্য সম্পত্তি যুক্ত করতে পারেন:

class Example {
}
Object.defineProperty(Example, 'constant1', {
    value: 33,
    writable : false,
    enumerable : true,
    configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError

আমরা ঠিক যেমন কিছু করতে পারতাম তবে এটি দুর্দান্ত হতে পারে:

class Example {
    static const constant1 = 33;
}

তবে দুর্ভাগ্যক্রমে এই শ্রেণীর সম্পত্তি সিনট্যাক্সটি কেবল একটি ES7 প্রস্তাবনাতে রয়েছে এবং তারপরেও এটি constসম্পত্তিতে যোগ করার অনুমতি দেয় না ।


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

3
উপরের চূড়ান্তভাবে ক্লাসে একটি ধ্রুবক সম্পত্তি যুক্ত করার সময়, ধ্রুবকের জন্য আসল মান "শ্রেণীর সংজ্ঞা" ""} "এর বাইরে", যা সত্যই এনক্যাপসুলেশনের একটি সংজ্ঞা লঙ্ঘন করে। আমি অনুমান করি শ্রেণীর "অভ্যন্তর" কেবল ধ্রুবক সম্পত্তি সংজ্ঞায়িত করার পক্ষে এটি যথেষ্ট এবং এই ক্ষেত্রে প্রাপ্তির কোনও প্রয়োজন নেই।
NoChance

1
পছন্দ করুন এটি ছিল মাত্র চিত্রণমূলক। গেটর পদ্ধতি প্রয়োজনে মানটিকে পুরোপুরি সজ্জিত করতে পারে না এমন কোনও কারণ নেই।
কোডিংইন্ট্রিগ

ES7 প্রস্তাবটি ব্যবহারের অপেক্ষায় রয়েছি কারণ এটি আমার কাছে বেশি প্রাকৃতিক এবং সংখ্যাগরিষ্ঠ ওও ভাষার সমতুল্য বলে মনে হচ্ছে।
সংগৃহীত

আমি কী ধ্রুবক একটি উদাহরণ পরিবর্তনশীল ঘোষণা করতে চাই? আমি কি এর মতো কিছু করতে পারিthis.defineProperty(this, 'constant1', {...})
ফ্রান্সেস্কো বোই

33
class Whatever {
    static get MyConst() { return 10; }
}

let a = Whatever.MyConst;

আমার জন্য কাজ করে বলে মনে হয়।


ক্লাসের ভিতরে কি কোনও সাধারণ পদ্ধতিতে এই অ্যাক্সেসযোগ্য?
পাইরেটএপ

3
@ পাইরেট অ্যাপ্লিকেশন আপনি ক্লাসের কোনও উদাহরণ থেকে এমনকি এটি স্থিতিশীল পদ্ধতি হিসাবে যে কোনও জায়গায় অ্যাক্সেস করতে পারবেন। তবে এটি স্থির হিসাবে আপনি this.MyConstকোনও Whateverউদাহরণের অভ্যন্তর থেকে ব্যবহার করতে পারবেন না , আপনাকে সর্বদা এটি লিখতে হবে: Whatever.MyConst
TheDarkIn1978

23

আমি ব্যবহার করছি babelএবং নিম্নলিখিত বাক্য গঠন আমার জন্য কাজ করছে:

class MyClass {
    static constant1 = 33;
    static constant2 = {
       case1: 1,
       case2: 2,
    };
    // ...
}

MyClass.constant1 === 33
MyClass.constant2.case1 === 1

আপনার প্রিসেট প্রয়োজন দয়া করে বিবেচনা করুন "stage-0"
এটি ইনস্টল করতে:

npm install --save-dev babel-preset-stage-0

// in .babelrc
{
    "presets": ["stage-0"]
}

হালনাগাদ:

বর্তমানে ব্যবহার stage-3


21
সমস্যা হ'ল ধ্রুবকটি পুনরায় সাজানো যায়। ওপ এটি চায় না
কোডিংআইট্রিগ

3
এফওয়াইআই, এটি এখন stage-2
বাবেল

3
এগুলি ধ্রুবক নয়
ডেভ এল।

1
@ কোডিং ইন্ট্রিগ্রু Object.freeze()ক্লাসে ডাক দিবেন যে এটি ঠিক করুন?
এন্টিমোনি

1
@ অ্যান্টিমনি আমি এটি পরীক্ষা করে দেখিনি তবে আমি এটিই ভাবব। সমস্যাটি এটি শ্রেণীর সমস্ত বৈশিষ্ট্যের ক্ষেত্রে প্রযোজ্য। অ-স্থিরও।
কোডিংইন্ট্রিগ

14

ইন এই দস্তাবেজটি এটা বলে:

প্রোটোটাইপ ডেটা বৈশিষ্ট্য (পদ্ধতি ব্যতীত) শ্রেণীর বৈশিষ্ট্য বা উদাহরণ সম্পত্তি হিসাবে সংজ্ঞায়নের জন্য (ইচ্ছাকৃতভাবে) কোনও সরাসরি ঘোষিত উপায় নেই

এর অর্থ এটি ইচ্ছাকৃতভাবে এর মতো is

হয়তো আপনি কনস্ট্রাক্টরের একটি ভেরিয়েবল সংজ্ঞায়িত করতে পারেন?

constructor(){
    this.key = value
}

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

1
ধ্রুবকগুলি পরিবর্তনযোগ্য হতে হবে। নির্মাণের সময় অবজেক্টটিতে বৈশিষ্ট্য বরাদ্দ করা হলে এমন বৈশিষ্ট্য পাওয়া যাবে যা পরিবর্তিত হতে পারে।
ফিল্রাজ

11

Object.freezeএটিকে অপরিবর্তনীয় করে তোলার জন্য আপনার ক্লাস (এস 6) / কনস্ট্রাক্টর ফাংশন (এস 5) অবজেক্টে ব্যবহার করাও সম্ভব :

class MyConstants {}
MyConstants.staticValue = 3;
MyConstants.staticMethod = function() {
  return 4;
}
Object.freeze(MyConstants);
// after the freeze, any attempts of altering the MyConstants class will have no result
// (either trying to alter, add or delete a property)
MyConstants.staticValue === 3; // true
MyConstants.staticValue = 55; // will have no effect
MyConstants.staticValue === 3; // true

MyConstants.otherStaticValue = "other" // will have no effect
MyConstants.otherStaticValue === undefined // true

delete MyConstants.staticMethod // false
typeof(MyConstants.staticMethod) === "function" // true

শ্রেণিটি পরিবর্তনের চেষ্টা আপনাকে একটি নরম ব্যর্থতা দেবে (কোনও ত্রুটি ফেলবে না, এটির কোনও প্রভাব নেই)।


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

আমি Object.freeze()অপরিবর্তনশীলতা প্রয়োগের জন্য ভালবাসি , এবং এটি ইদানীং অনেকটা ব্যবহার করে আসছি। এটি পুনরাবৃত্তভাবে প্রয়োগ করতে ভুলবেন না!
jeffwtribble

6

সম্ভবত কেবল আপনার সমস্ত ধ্রুবককে হিমায়িত অবজেক্টে রেখেছেন?

class MyClass {

    constructor() {
        this.constants = Object.freeze({
            constant1: 33,
            constant2: 2,
        });
    }

    static get constant1() {
        return this.constants.constant1;
    }

    doThisAndThat() {
        //...
        let value = this.constants.constant2;
        //...
    }
}

স্ট্যাটিক ফাংশনটি 'এই' পরিবর্তনশীলটি ব্যবহার করতে পারে না।
পোকারফোর্ড

4

Https://stackoverflow.com/users/2784136/rodrigo-botti এর মত , আমি মনে করি আপনি খুঁজছেন Object.freeze()। অপরিবর্তনীয় স্ট্যাটিক্স সহ একটি শ্রেণির উদাহরণ এখানে:

class User {
  constructor(username, age) {
    if (age < User.minimumAge) {
      throw new Error('You are too young to be here!');
    }
    this.username = username;
    this.age = age;
    this.state = 'active';
  }
}

User.minimumAge = 16;
User.validStates = ['active', 'inactive', 'archived'];

deepFreeze(User);

function deepFreeze(value) {
  if (typeof value === 'object' && value !== null) {
    Object.freeze(value);
    Object.getOwnPropertyNames(value).forEach(property => {
      deepFreeze(value[property]);
    });
  }
  return value;
}

1

এখানে আপনি আরও একটি উপায় করতে পারেন

/*
one more way of declaring constants in a class,
Note - the constants have to be declared after the class is defined
*/
class Auto{
   //other methods
}
Auto.CONSTANT1 = "const1";
Auto.CONSTANT2 = "const2";

console.log(Auto.CONSTANT1)
console.log(Auto.CONSTANT2);

দ্রষ্টব্য - অর্ডারটি গুরুত্বপূর্ণ, আপনার উপরের ধ্রুবকগুলি থাকতে পারে না

ব্যবহার কনসোল.লগ (Auto.CONSTANT1);


5
যদিও তারা অপরিবর্তনীয় নয়
জন হার্ডিং

1

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

const withConsts = (map, BaseClass = Object) => {
  class ConstClass extends BaseClass { }
  Object.keys(map).forEach(key => {
    Object.defineProperty(ConstClass, key, {
      value: map[key],
      writable : false,
      enumerable : true,
      configurable : false
    });
  });
  return ConstClass;
};

class MyClass extends withConsts({ MY_CONST: 'this is defined' }) {
  foo() {
    console.log(MyClass.MY_CONST);
  }
}

1

ক্লাসকে হিমায়িত করে আপনি "ধ্রুবকগুলি" কেবল পঠনযোগ্য (অপরিবর্তনীয়) করতে পারেন। যেমন

class Foo {
    static BAR = "bat"; //public static read-only
}

Object.freeze(Foo); 

/*
Uncaught TypeError: Cannot assign to read only property 'BAR' of function 'class Foo {
    static BAR = "bat"; //public static read-only
}'
*/
Foo.BAR = "wut";

0

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

class MyClass {
    // ...

}
MyClass.prototype.consts = { 
    constant1:  33,
    constant2: 32
};
mc = new MyClass();
console.log(mc.consts.constant2);    


0

আমি এটা করেছি.

class Circle
{
    constuctor(radius)
    {
        this.radius = radius;
    }
    static get PI()
    {
        return 3.14159;
    }
}

পিআই এর মান পরিবর্তন থেকে রক্ষা করা হয় কারণ এটি কোনও ফাংশন থেকে ফেরত আসার মান। আপনি এটি সার্কেল.পিআই এর মাধ্যমে অ্যাক্সেস করতে পারবেন। এটি নির্ধারণের যে কোনও প্রয়াস [] এর মাধ্যমে একটি স্ট্রিং চরিত্রকে নির্ধারণের প্রয়াসের অনুরূপভাবে সহজভাবে মেঝেতে ফেলে দেওয়া হয়।


0

আপনি এটি এর মতো সংজ্ঞা দিতে পারেন:

class Foo {
  static MyConst = 200;

  myFunc() {
    const doubleConst = Foo.MyConst * 2;
  }
}

0

আপনি import * asসিনট্যাক্স ব্যবহার করতে পারেন । শ্রেণি না হলেও এগুলি প্রকৃত constপরিবর্তনশীল।

Constants.js

export const factor = 3;
export const pi = 3.141592;

index.js

import * as Constants from 'Constants.js'
console.log( Constants.factor );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.