জাভাস্ক্রিপ্টে সম্পত্তি এবং পদ্ধতির নামের জন্য উপসর্গ বোঝা


241

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

২.7 পাইথন ডকুমেন্টেশন থেকে:

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

এটি কি জাভাস্ক্রিপ্টের জন্য প্রযোজ্য?

উদাহরণস্বরূপ এই জাভাস্ক্রিপ্ট কোডটি ধরুন:

function AltTabPopup() {
    this._init();
}

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}

এছাড়াও, আন্ডারস্কোর প্রিফিক্সড ভেরিয়েবলগুলি ব্যবহৃত হয়।

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

শুধু কনভেনশন? বা আন্ডারস্কোর উপসর্গের পিছনে আরও কিছু আছে?


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


উত্তর:


33

2019 এ স্বাগতম!

এটা একটা মনে হচ্ছে, প্রস্তাব বর্গ সিনট্যাক্স প্রসারিত করতে অনুমতি দেওয়ার জন্য #বেসরকারী গৃহীত হয় হতে পূর্বে সমাধান পরিবর্তনশীল। এই সমর্থন সহ ক্রোম 74 জাহাজ

_ উপসর্গযুক্ত পরিবর্তনশীল নামগুলি কনভেনশন দ্বারা ব্যক্তিগত হিসাবে বিবেচনা করা হয় তবে এখনও তা সর্বজনীন।

এই বাক্য গঠনটি সংক্ষিপ্ত এবং স্বজ্ঞাত উভয়ই হওয়ার চেষ্টা করে, যদিও এটি অন্যান্য প্রোগ্রামিং ভাষার থেকে পৃথক।

সমস্ত ইউনিকোড কোড পয়েন্টের মধ্যে কেন সিগিলকে # বেছে নেওয়া হয়েছিল?

  • @ প্রাথমিক পছন্দ ছিল তবে এটি সাজসজ্জাবিদরা নিয়েছিলেন। টিসি 39 স্বর্ণের সজ্জকার এবং বেসরকারী রাষ্ট্রের সিগিল বিবেচনা করেছে, তবে কমিটি সিদ্ধান্ত নিয়েছে যে ট্রান্সপোর্টার ব্যবহারকারীদের বিদ্যমান ব্যবহারকে পিছিয়ে দেবে।
  • _ বিদ্যমান জাভাস্ক্রিপ্ট কোডের সাথে সামঞ্জস্যতা সমস্যার কারণ হতে পারে, যা একটি সনাক্তকারী বা (সর্বজনীন) সম্পত্তি নামের শুরুতে _ দীর্ঘ সময়ের জন্য অনুমতি দিয়েছে।

এই প্রস্তাবটি জুলাই 2017 সালে 3 মঞ্চে পৌঁছেছে that সেই সময় থেকে বিভিন্ন বিকল্প নিয়ে ব্যাপক চিন্তাভাবনা এবং দীর্ঘ আলোচনা হয়েছে। শেষ পর্যন্ত, এই চিন্তাধারার প্রক্রিয়া এবং অব্যাহত সম্প্রদায়গত জড়িততা এই ভাণ্ডারটিতে প্রস্তাবের বিষয়ে নতুন sensকমত্যের দিকে পরিচালিত করে। সেই sensকমত্যের ভিত্তিতে বাস্তবায়নগুলি এই প্রস্তাবে এগিয়ে চলেছে।

Https://caniuse.com/#feat=mdn-javascript_class_private_class_fields দেখুন


257

এটি কেবল একটি সম্মেলন। জাভাস্ক্রিপ্ট ভাষা আন্ডারস্কোর অক্ষর দিয়ে শুরু হওয়া শনাক্তকারীদের কোনও বিশেষ অর্থ দেয় না।

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


4
হা. ভাষা যদি এটি "সমর্থন" না করে, এটি একটি সত্যই কার্যকর কনভেনশন।
জুহো ভেস্পসালিনেন

গুরুতর সমস্যা। jsfiddle.net/VmFSR আপনি যেমন দেখতে পাচ্ছেন, তৈরি করা মানটি ব্যবহার করে _আমি কী করতে চাই তা জানতে চাইলে কেবল নতুন মান তৈরি করা হয়, তৈরি করা হয় !? কেন এটি this.nameপরিবর্তে হয় না ?
মুহাম্মদ উমর

1
@ মুহাম্মাদ উমর, আমি নিশ্চিত নই যে আপনার মন্তব্য আমি বুঝেছি। console.log(someone._name = "Jean Dupont");পাশাপাশি কাজ করে console.log(someone.name);এবং এটি উভয়ই সম্পত্তির পিছনে আন্ডারস্কোর-প্রিফিক্সড সদস্যকে নির্ধারিত করে এবং মূল্যায়ন করে। যেমন আপনি দেখতে পাচ্ছেন , আন্ডারস্কোরগুলির মাধ্যমে কোনও গ্যারান্টিযুক্ত এনক্যাপসুলেশন নেই :)
ফ্রেডেরিক হামিদি

3
ডিফল্টরূপে, ভিজ্যুয়াল স্টুডিও আপনাকে এটি সম্মান করতে সহায়তা করার চেষ্টা করে। "এই" ভেরিয়েবলটি ব্যবহার করার সময় জাভাস্ক্রিপ্ট ইন্টেলিসেন্স ইঞ্জিন আপনাকে "ব্যক্তিগত" বৈশিষ্ট্যগুলি দেখাবে the তবে, বাইরে থেকে ডাকলে, এটি সমস্ত আন্ডারকর্ড করা বৈশিষ্ট্যগুলি গোপন করে।
শিয়াল

1
@ কারুহঙ্গা তিনি এর জবাব 2010 সালে দিয়েছেন - অবশ্যই 10 বছরে জিনিসগুলি পরিবর্তিত হয়েছে
কেনি মায়ার

99

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


19
বন্ধ কীভাবে অর্জন করবেন তা স্পষ্ট করার জন্য ভোট আপ করুন, আন্ডারস্কোর বলার পক্ষে ডাউন ভোটটি ভাল সম্মেলন। সুতরাং আমি
জেসন

3
ক্লোজারে সদস্যদের লুকানো কখনও কখনও টেস্টিবিলিটি বাধাগ্রস্থ করতে পারে। এই নিবন্ধটি দেখুন: পর্যাপ্ত পরিমাণে.
com/2010/

4
@ জেসন - কেবল কৌতূহলী, আপনি কেন একটি খারাপ সম্মেলনকে আন্ডারস্কোর হিসাবে বিবেচনা করছেন?
ট্যামস পাপ

5
@ তমসাপ্যাপ - কয়েকটি কারণ, তবে কেবল আমার বিকল্প: 1) জেএসকে অন্যান্য ভাষার স্টাইলে বাধ্য করার জন্য একটি ক্রাচ 2) যদি এটি অ্যাক্সেসযোগ্য হয় তবে এটি ব্যবহৃত হবে। আন্ডারস্কোরটি বাইরে লিটারে লিটার আপ করতে এবং দৃ conv়প্রত্যয় করতে পারে। 3) নতুন জেএস প্রোগ্রামারগুলিকে বিভ্রান্ত করা।
জেসন

9
এমনকি বন্ধ হওয়ার পরেও তথাকথিত "ব্যক্তিগত" ভেরিয়েবলের অ্যাক্সেস পাওয়া প্রযুক্তিগতভাবে এখনও সম্ভব। _ কনভেনশনটি কমপক্ষে ডেভসকে তাদের নিজের ঝুঁকিতে (বা এর মতো কিছু) জানতে দেয়।
স্যারিংক করুন

14

জেএসডোক 3 আপনাকে @access private(পূর্ববর্তী @privateট্যাগ) দিয়ে আপনার ফাংশনগুলি বেনিফিট করতে দেয় যা অন্য বিকাশকারীদের কাছে আপনার অভিপ্রায় সম্প্রচারের জন্যও দরকারী - http://usejsdoc.org/tags-access.html


10

"কেবল কনভেনশন? বা আন্ডারস্কোর উপসর্গের পিছনে আরও কিছু আছে?"

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

উদাহরণ ( https://github.com/mmikowski/urianchor থেকে ):

$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

ব্রাউজার অনুসন্ধান ক্ষেত্রের ইউআরআই অ্যাঙ্কারকে এতে পরিবর্তন করা হয়েছে:

\#!page=profile:uname,wendy|online,today

এটি হ্যাশ পরিবর্তনের উপর ভিত্তি করে অ্যাপ্লিকেশন স্টেট চালানোর জন্য ব্যবহৃত একটি সম্মেলন।


8

import/exportES6 দিয়ে এখন কাজটি করছে। আমি এখনও _আমার বেশিরভাগ ফাংশন রফতানি করে রফতানি না করা ফাংশনগুলির প্রিফিক্স প্রবণতা করি ।

আপনি যদি কেবলমাত্র একটি শ্রেণি রফতানি করেন (কৌণিক প্রকল্পগুলির মতো), এটি মোটেই প্রয়োজন হয় না।

export class MyOpenClass{

    open(){
         doStuff()
         this._privateStuff()
         return close();
    }

    _privateStuff() { /* _ only as a convention */} 

}

function close(){ /*... this is really private... */ }

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

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