আমি কীভাবে জাভাস্ক্রিপ্টে একটি নেমস্পেস ঘোষণা করব?


990

আমি কীভাবে জাভাস্ক্রিপ্টে একটি নেমস্পেস তৈরি করব যাতে আমার অবজেক্টস এবং ফাংশনগুলি একই একই নামযুক্ত বস্তু এবং ফাংশনগুলিকে ওভাররাইট করা না যায়? আমি নিম্নলিখিত ব্যবহার করেছি:

if (Foo == null || typeof(Foo) != "object") { var Foo = new Object();}

এটি করার জন্য আরও কি মার্জিত বা সংক্ষিপ্ত উপায় আছে?


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

18
একটি শীর্ষ স্তরের "নেমস্পেস" নিন (উইন্ডো সম্পত্তি)। অর্জন কর. পরীক্ষার আগেই দ্বন্দ্বগুলি সনাক্ত করা উচিত। এই সমস্ত "কী যদি" ​​চেকগুলি যুক্ত করে বিরক্ত করবেন না। এটি সদৃশ "নেমস্পেস" এর জন্য মারাত্মক সমস্যা এবং এটির মতোই আচরণ করা উচিত । আপনি কোনও কাস্টম "নেমস্পেস" বসানোর অনুমতি দিতে jQuery এর মত একটি পদ্ধতি অনুসরণ করতে পারেন; তবে এটি এখনও একটি ডিজাইন-সময় সমস্যা।

দয়া করে আপনার গৃহীত উত্তরটি স্ট্যাকওভারফ্লো.com / জিজ্ঞাসাগুলি / 881515 /… তে পরিবর্তন করুন , এটি অনেক বেশি মার্জিত এবং আপডেট সমাধান।
hlpcoding

@pst YUI কী করবে? আমি বিশ্বাস করি তারা তাদের নামের জায়গায় ক্রমান্বয়ে যুক্ত করার জন্য তারা ঠিক এটি করেছে exactly এইচটিটিপি পরিবেশে পারফরম্যান্সের জন্য এই জাতীয় কৌশলগুলি অবশ্যই প্রয়োজন?
সাইমন_উইভার

পারফরম্যান্স ইস্যুগুলির জন্য স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি / ২২১০২৪৯ / / দেখুন
টিম আবেল

উত্তর:


764

আমি এটি পছন্দ করি:

var yourNamespace = {

    foo: function() {
    },

    bar: function() {
    }
};

...

yourNamespace.foo();

62
গুরুত্বপূর্ণ বিষয়টি হ'ল এক মূল ভেরিয়েবলের চেয়ে প্রসারিত হওয়ার বিষয়ে ধর্মীয় হওয়া। সবকিছু এ থেকে প্রবাহিত করা আবশ্যক।
আনাকাটা

22
এটি আপনার কোডের জন্য কোনও ক্লোজার তৈরি করে না - এটি আপনার অন্যান্য ক্রিয়াকলাপগুলিকে কল করা ক্লান্তিকর করে তোলে কারণ তাদের সর্বদা দেখতে হবে: yourNamespace.bar (); এই নকশার সমস্যাটি সমাধান করার জন্য আমি একটি ওপেন সোর্স প্রকল্প JUST করেছি: github.com/mckoss/namespace
mckoss

24
অন্নাকাটা: "গুরুত্বপূর্ণ বিষয়টি হ'ল এক মূল পরিবর্তকের চেয়ে প্রসারিত হওয়ার বিষয়ে ধর্মীয় হওয়া?" কেন এটি?
ব্যবহারকারী 406905

11
@ অ্যালেক্স - কেন অগভীর অবজেক্টের কাঠামো থাকতে হবে?
রায়ান

25
@ রায়ান আমি বোঝাতে চাইছি যে সবকিছুই এর অধীনে থাকা উচিত MyApp, যেমন এবং এর MyApp.Views.Profile = {}চেয়ে বেশি । অগত্যা যে কেবল দুটি স্তরের গভীরতা থাকা উচিত। MyApp.users = {}MyViews.Profile = {}
অ্যালেক্স

1042

আমি এন্টারপ্রাইজ jQuery সাইটে পাওয়া পদ্ধতির ব্যবহার :

এখানে কীভাবে ব্যক্তিগত এবং জনসাধারণের সম্পত্তি এবং কার্যাদি ঘোষণা করা যায় তার উদাহরণ তাদের উদাহরণ is একটি স্ব-কার্যকরকারী বেনাম ফাংশন হিসাবে সবকিছু করা হয়।

(function( skillet, $, undefined ) {
    //Private Property
    var isHot = true;

    //Public Property
    skillet.ingredient = "Bacon Strips";

    //Public Method
    skillet.fry = function() {
        var oliveOil;

        addItem( "\t\n Butter \n\t" );
        addItem( oliveOil );
        console.log( "Frying " + skillet.ingredient );
    };

    //Private Method
    function addItem( item ) {
        if ( item !== undefined ) {
            console.log( "Adding " + $.trim(item) );
        }
    }
}( window.skillet = window.skillet || {}, jQuery ));

সুতরাং আপনি যদি সর্বজনীন সদস্যদের মধ্যে একটিতে অ্যাক্সেস করতে চান তবে আপনি কেবল যান skillet.fry()বা যাবেন skillet.ingredients

সত্যিই দুর্দান্ত যা হ'ল আপনি এখন একই একই বাক্য গঠন ব্যবহার করে নাম স্থানটি প্রসারিত করতে পারেন।

//Adding new Functionality to the skillet
(function( skillet, $, undefined ) {
    //Private Property
    var amountOfGrease = "1 Cup";

    //Public Method
    skillet.toString = function() {
        console.log( skillet.quantity + " " +
                     skillet.ingredient + " & " +
                     amountOfGrease + " of Grease" );
        console.log( isHot ? "Hot" : "Cold" );
    };
}( window.skillet = window.skillet || {}, jQuery ));

তৃতীয় undefinedযুক্তি

তৃতীয়, undefinedআর্গুমেন্টটি মানের পরিবর্তনশীলের উত্স undefined। আমি আজও এটি প্রাসঙ্গিক কিনা তা নিশ্চিত নই, তবে পুরানো ব্রাউজার / জাভাস্ক্রিপ্ট মান (ইকোসক্রিপ্ট 5, জাভাস্ক্রিপ্ট <1.8.5 ~ ফায়ারফক্স 4) এর সাথে কাজ করার সময়, বিশ্বব্যাপী স্কোপ ভেরিয়েবলটি undefinedলেখার যোগ্য , তাই যে কেউ তার মানটিকে আবার লিখতে পারে। তৃতীয় আর্গুমেন্ট (যখন কোনও মান পাস করা হয় না) নামের একটি ভেরিয়েবল তৈরি করে undefinedযা নেমস্পেস / ফাংশনে স্কোপ করা হয়। আপনি নাম স্থান তৈরি করার সময় কোনও মান পাস করা হয়নি, কারণ এটি মান থেকে ডিফল্ট হয় undefined


9
এই দুর্দান্ত নমুনার জন্য +1। আগ্রহীদের জন্য, এই নমুনাটি মিক্স 2011 এ এলিজা মনোর দুর্দান্ত
ড্যারেন লুইস

11
এলিয়াহর নিবন্ধ থেকে, এখানে এই পদ্ধতির পক্ষে মতামত রয়েছে, যা বর্ণনা করা হয়েছে। পেশাদাররা: ১. সরকারী এবং ব্যক্তিগত সম্পত্তি এবং পদ্ধতিগুলি, ২ জটিল ওলন ব্যবহার করে না, ৩. অপরিজ্ঞাত রক্ষা করে 4.. এটি নিশ্চিত করে যে Qu jQuery বোঝায়, ৫. নেমস্পেস ফাইলগুলিকে বিস্তৃত করতে পারে, কনস: ওএলএন
জ্যারেড বেক

4
এটিকে আজ আইআইএফই ( তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন ) বলা হয়। আপনার উত্তর +1 জন্য ধন্যবাদ!
গুস্তাভো গন্ডিম

20
@CpILL: নিশ্চিত যদি এখনও প্রাসঙ্গিক কিন্তু তৃতীয়, undefinedযুক্তি মূল্যের পরিবর্তনশীল উৎস undefined। পুরানো ব্রাউজারগুলি / জাভাস্ক্রিপ্ট স্ট্যান্ডার্ডের সাথে কাজ করার সময় (বাস্তু স্ক্রিপ্ট 5, জাভাস্ক্রিপ্ট <1.8.5 ~ ফায়ারফক্স 4), গ্লোবাল-স্কোপ ভেরিয়েবল undefinedলিখনযোগ্য, যাতে যে কেউ এর মানটিকে আবার লিখতে পারে। তৃতীয়টি যোগ করুন, আপনি যে অতিরিক্ত যুক্তিটি পাস করছেন না তা এটির মান হয়ে যায় undefined, তাই আপনি নাম স্থান-সুযোগ তৈরি করছেন undefinedযা বাইরের উত্স দ্বারা পুনরায় লেখা হবে না।
mrówa

4
@ সাফায়ারসুন এর সুবিধাটি হ'ল তারা window.skillet = window.skillet || {}একাধিক স্ক্রিপ্টগুলি নিরাপদভাবে একই নামস্থানে যুক্ত করার অনুমতি দেয় যখন তারা কোন আদেশ কার্যকর করবে তা আগেই জানে না। আপনি যদি আপনার কোডটি না ভেঙে নিজের স্ক্রিপ্ট অন্তর্ভুক্তিগুলি স্বেচ্ছাসেবীভাবে পুনরায় অর্ডার করতে সক্ষম হতে চান বা আপনি যদি এসিঙ্ক বৈশিষ্ট্য সহ অ্যাসিঙ্ক্রোনালি স্ক্রিপ্টগুলি লোড করতে চান এবং কার্যকর করার আদেশ সম্পর্কে কোনও গ্যারান্টি না থাকে তবে এটি সহায়ক হতে পারে। স্ট্যাকওভারফ্লো
মার্ক অ্যামেরি

338

এটি করার আরেকটি উপায়, যা আমি এটিকে বস্তুর আক্ষরিক আকারের চেয়ে কিছুটা কম সীমাবদ্ধ বলে মনে করি, তা হ'ল:

var ns = new function() {

    var internalFunction = function() {

    };

    this.publicFunction = function() {

    };
};

উপরেরটি মডিউল প্যাটার্নের মতো দেখতে অনেকটা সুন্দর এবং আপনি এটি পছন্দ করেন বা না চান , কোনও বস্তুর আক্ষরিক কাঠামোর কাঠামো এড়িয়ে গিয়ে এটি আপনাকে আপনার সমস্ত ফাংশন প্রকাশ্যে প্রকাশ করতে দেয়।


16
1. ওএলএন এবং মডিউল প্যাটার্নের মধ্যে পার্থক্য রয়েছে। ২. আমি / সর্বদা / ওএলএন এর মতো না কারণ আপনাকে শেষের পিছনে কমা না দেওয়ার কথা মনে রাখতে হবে এবং আপনার সমস্ত বৈশিষ্ট্য একটি মান দিয়ে শুরু করতে হবে (নাল বা অপরিজ্ঞাতের মতো)। এছাড়াও, যদি আপনাকে সদস্য কার্যের জন্য ক্লোজার প্রয়োজন হয় তবে আপনার সেই প্রতিটি পদ্ধতির জন্য ছোট ফাংশন কারখানার প্রয়োজন হবে। আরেকটি বিষয় হ'ল আপনাকে অবশ্যই আপনার সমস্ত কন্ট্রোল স্ট্রাকচারগুলি ফাংশনের অভ্যন্তরে আবদ্ধ করতে হবে, যেখানে উপরের ফর্মটি এতে চাপিয়ে দেয় না। এটি বলার অপেক্ষা রাখে না যে আমি ওলএন ব্যবহার করি না, এটি কখনও কখনও আমার পছন্দ হয় না।
আয়নু জি স্টান

8
আমি এই পদ্ধতির পছন্দ করি কারণ এটি ব্যক্তিগত ফাংশন, ভেরিয়েবল এবং সিউডো-কনস্ট্যান্টের (যেমন var API_KEY = 12345;) অনুমতি দেয়।
লরেন্স বরসন্তী

12
আমি বেশি কমে কমা বিচ্ছিন্ন বস্তু ধারক চেয়ে ভাল এটি পছন্দ করি। তুলনায় আমি কোনও ত্রুটি দেখতে পাচ্ছি না। আমি কিছু অনুপস্থিত করছি?
লুসেন্ট

7
জেএস নিউবি এখানে এখানে ... আমাকে কেন টাইপ করতে হবে না ns().publicFunction(), তা হচ্ছে ... ns.publicFunction()কাজ করে।
জন ক্রাফ্ট

14
@ জন ক্রাফট, এটি newকীওয়ার্ডের সামনে মূল শব্দটির মূল কারণ function। মূলত, এটিই করছে যে এটি একটি বেনাম ফাংশন ঘোষণা করছে (এবং একটি ফাংশন হিসাবে এটি পাশাপাশি একটি নির্মাণকারীও), এবং এটি তখনই এটির ব্যবহারকারীর সাহায্যে অনুরোধ করে new। সেই হিসাবে, চূড়ান্ত মান যা ভিতরে সঞ্চিত nsহয় তা অনামী কনস্ট্রাক্টরের একটি (অনন্য) উদাহরণ। আশা করি তা বোধগম্য হয়।
আয়নু জি স্টান

157

এটি করার জন্য আরও কি মার্জিত বা সংক্ষিপ্ত উপায় আছে?

হ্যাঁ. উদাহরণ স্বরূপ:

var your_namespace = your_namespace || {};

তাহলে আপনি পেতে পারেন

var your_namespace = your_namespace || {};
your_namespace.Foo = {toAlert:'test'};
your_namespace.Bar = function(arg) 
{
    alert(arg);
};
with(your_namespace)
{
   Bar(Foo.toAlert);
}

1
এটি আমাকে আই 7 এ একটি ত্রুটি দেয়। var আপনার_নামস্পেস = (আপনার_নামস্পেস == "অপরিজ্ঞাত" || আপনার_নামস্পেস)? ;}: আপনার_নামস্পেস; আরও ভাল কাজ করে
mjallday

9
এটি আপনার_নামস্পেস = আপনার_নামস্পেস = আপনার_নামস্পেস || } Every প্রতিটি ব্রাউজারে কাজ করে;)
পালো

আমার কাছ থেকে +1! পাতলা জ্যাকো প্রিটোরিয়াস উত্তর হিসাবে একটি লাইব্রেরি বিভিন্ন ফাইল বা একই ফাইলের বিভিন্ন জায়গায় প্রসারিত করে কাজ করে। শুধু উজ্জ্বল!
সেন্টুরিয়ান

2
@ পালো আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি এমন হওয়া উচিত? var your_namespace = your_namespace = your_namespace || {}
শ্রীরাম

6
আপনার বিভিন্ন জেএস ফাইলগুলিতে আপনার_নামস্পেস অবজেক্টটি বাড়ানোর সম্ভাবনা থাকবে। Var your_namespace = using using ব্যবহার করার সময় আপনি এটি করতে পারবেন না, কারণ প্রতিটি ফাইলের মাধ্যমে বস্তুটি ওভাররাইড হয়ে যাবে
অ্যালেক্স প্যাকুরার

92

আমি সাধারণত এটি বন্ধে তৈরি করি:

var MYNS = MYNS || {};

MYNS.subns = (function() {

    function privateMethod() {
        // Do private stuff, or build internal.
        return "Message";
    }

    return {
        someProperty: 'prop value',
        publicMethod: function() {
            return privateMethod() + " stuff";
        }
    };
})();

এই লেখার পর থেকে বছরের পর বছর ধরে আমার স্টাইলে একটি সূক্ষ্ম পরিবর্তন এসেছে, এবং আমি এখন নিজেকে এইভাবে বন্ধ লিখতে দেখছি:

var MYNS = MYNS || {};

MYNS.subns = (function() {
    var internalState = "Message";

    var privateMethod = function() {
        // Do private stuff, or build internal.
        return internalState;
    };
    var publicMethod = function() {
        return privateMethod() + " stuff";
    };

    return {
        someProperty: 'prop value',
        publicMethod: publicMethod
    };
})();

এইভাবে আমি পাবলিক এপিআই এবং বাস্তবায়ন বোঝার জন্য আরও সহজ পাই। প্রত্যাবর্তনের বিবৃতিটিকে বাস্তবায়নের সর্বজনীন ইন্টারফেস হিসাবে ভাবেন।


3
আপনার কি পরীক্ষা করা উচিত নয় MYNS.subns = MYNS.subns || {}??
মিরকো

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

1
"কুইক অ্যান্ড ডার্টি মডিউল" শিরোনামে, "স্পিকিং জাভাস্ক্রিপ্ট" বইটিতে 412 পৃষ্ঠায় এই পদ্ধতির ব্যাখ্যা রয়েছে।
সোফেরিও

2
অপ্টিমাইজেশনের টিপ: ব্যক্তিগত থাকার সময় var foo = functionএবং function fooএকইরকম; জাভাস্ক্রিপ্টের গতিশীল টাইপযুক্ত প্রকৃতির কারণে, বেশিরভাগ দোভাষীদের পাইপলাইনে কয়েকটি নির্দেশনা এড়িয়ে যাওয়ায় পরবর্তীটি কিছুটা দ্রুত হয়। এর সাথে var fooটাইপ সিস্টেমে কোন ধরণের ভার বলা হচ্ছে তা নির্ধারণ করতে অনুরোধ করতে হবে, যখন function fooটাইপ সিস্টেমটি স্বয়ংক্রিয়ভাবে জানে যে এটি কোনও ফাংশন, সুতরাং একটি দম্পতি ফাংশন কল এড়িয়ে যায়, যা সিপিইউ নির্দেশনার কম অনুরোধে অনুবাদ করে like jmp, pushq, popq, ইত্যাদি, যা একটি খাটো CPU- র পাইপলাইন অনুবাদ।
ব্র্যাডেন সেরা

1
@ ব্রেট উফ তুমি ঠিক বলছো. আমি অন্য একটি স্ক্রিপ্টিং ভাষার কথা ভাবছিলাম। যদিও আমি এখনও জোর দিয়েছি function fooসিনট্যাক্সটি আরও পঠনযোগ্য। এবং আমি এখনও আমার সংস্করণ পছন্দ করি।
ব্র্যাডেন সেরা

56

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

একটি ফাইল নেমস্পেসটি ব্যবহার করতে পারে namespace.namespace1:

namespace = window.namespace || {};
namespace.namespace1 = namespace.namespace1 || {};

namespace.namespace1.doSomeThing = function(){}

অন্য একটি ফাইল নাম স্থানটি ব্যবহার করতে পারে namespace.namespace2:

namespace = window.namespace || {};
namespace.namespace2 = namespace.namespace2 || {};

namespace.namespace2.doSomeThing = function(){}

এই দুটি ফাইল সংঘর্ষ না করে একসঙ্গে বা পৃথকভাবে বেঁচে থাকতে পারে।


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

প্রশ্ন একাধিক ফাইল জন্য বিশেষভাবে জিজ্ঞাসা: stackoverflow.com/questions/5150124/...
সিরো Santilli冠状病毒审查六四事件法轮功

48

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

/**
* My JavaScript application
*
* @module myapp
*/

/** @namespace Namespace for MYAPP classes and functions. */
var MYAPP = MYAPP || {};

/**
* A maths utility
* @namespace MYAPP
* @class math_stuff
*/
MYAPP.math_stuff = {

    /**
    * Sums two numbers
    *
    * @method sum
    * @param {Number} a First number
    * @param {Number} b Second number
    * @return {Number} Sum of the inputs
    */
    sum: function (a, b) {
        return a + b;
    },

    /**
    * Multiplies two numbers
    *
    * @method multi
    * @param {Number} a First number
    * @param {Number} b Second number
    * @return {Number} The inputs multiplied
    */
    multi: function (a, b) {
        return a * b;
    }
};

/**
* Constructs Person objects
* @class Person
* @constructor
* @namespace MYAPP
* @param {String} First name
* @param {String} Last name
*/
MYAPP.Person = function (first, last) {

    /**
    * First name of the Person
    * @property first_name
    * @type String
    */
    this.first_name = first;

    /**
    * Last name of the Person
    * @property last_name
    * @type String
    */
    this.last_name = last;
};

/**
* Return Person's full name
*
* @method getName
* @return {String} First name + last name
*/
MYAPP.Person.prototype.getName = function () {
    return this.first_name + ' ' + this.last_name;
};

32

আমি এই পদ্ধতির ব্যবহার:

var myNamespace = {}
myNamespace._construct = function()
{
    var staticVariable = "This is available to all functions created here"

    function MyClass()
    {
       // Depending on the class, we may build all the classes here
       this.publicMethod = function()
       {
          //Do stuff
       }
    }

    // Alternatively, we may use a prototype.
    MyClass.prototype.altPublicMethod = function()
    {
        //Do stuff
    }

    function privateStuff()
    {
    }

    function publicStuff()
    {
       // Code that may call other public and private functions
    }

    // List of things to place publically
    this.publicStuff = publicStuff
    this.MyClass = MyClass
}
myNamespace._construct()

// The following may or may not be in another file
myNamespace.subName = {}
myNamespace.subName._construct = function()
{
   // Build namespace
}
myNamespace.subName._construct()

বাহ্যিক কোডগুলি তখন হতে পারে:

var myClass = new myNamespace.MyClass();
var myOtherClass = new myNamepace.subName.SomeOtherClass();
myNamespace.subName.publicOtherStuff(someParameter);

দুর্দান্ত বিস্তারিত! ধন্যবাদ! নেমস্পেস.জেএস-এ কী নেওয়ার তা ভাবছি। আমি নিজে কখনও এটি ব্যবহার করি নি, তাই ভাবছি আপনার জ্ঞান / দক্ষতা / অভিজ্ঞতা সম্পন্ন কেউ যদি এটি ব্যবহার করার বিষয়টি বিবেচনা করে।
জন

আমি এটা পছন্দ করি! অন্যদিকে আমি এই বাহ্যিক কোডের প্রথম লাইনে ব্যতিক্রম পেয়েছি, এই বলে: 'মাইনেমস্পেস.মাইক্লাস' [অপরিবর্তিত] নির্মাণকারী নয়। সম্ভবত এটি জেএস বাস্তবায়নের উপর নির্ভর করে? : /
ইয়ুসিবা

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

@ অ্যান্থনি ভ্যার এমওয়াইএসএসপিএস = এমওয়াইএসএসপিএইচ ব্যবহার করা আরও ভাল {}; কেবলমাত্র মাই নেমস্পেস = using using ব্যবহার করা অনিরাপদ এবং এরপরে ক্যাপগুলিতে আপনার নাম স্থানটি ঘোষণা করা আরও ভাল
পল

9
@ পল: "বেটার" বেশ সাবজেক্টিভ হতে পারে। আমি পড়ার কোডটি ঘৃণা করি যা আমাকে দেখে শোনায় তাই আমি সমস্ত বড় হাতের অক্ষর ব্যবহারকারী শনাক্তকারীদের ব্যবহার এড়াতে চাই। যদিও ns = ns || {}এটি আরও রক্ষণাত্মক বলে মনে হচ্ছে এটি অন্যান্য অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে।
অ্যান্টনিডব্লোন জোন্স

32

এটি ব্যবহারকারীর 106826 এর নেমস্পেস.জেএস-এর লিঙ্কটির ফলোআপ। দেখে মনে হচ্ছে প্রকল্পটি গিটহাবে চলে গেছে । এটি এখন স্মিথ / নেমস্পিডোজেটস

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

এটি আপনাকে নেমস্পেসের ঘোষণার অনুমতি দেয় এবং তারপরে সেই নেমস্পেসে অবজেক্ট / মডিউলগুলি সংজ্ঞায়িত করতে দেয়:

Namespace('my.awesome.package');
my.awesome.package.WildClass = {};

আরেকটি বিকল্প হ'ল নাম স্থান এবং এর বিষয়বস্তু একবারে ঘোষণা করা:

Namespace('my.awesome.package', {
    SuperDuperClass: {
        saveTheDay: function() {
            alert('You are welcome.');
        }
    }
});

আরও ব্যবহারের উদাহরণের জন্য উত্সের উদাহরণ.js ফাইলটি দেখুন ।


2
যতক্ষণ আপনি মনে রাখবেন এতে কিছু পারফরম্যান্স জড়িত রয়েছে, প্রতিবার আপনি আমার.ওয়াউজ.প্যাকেজ.ওয়াল্ড ক্লাস অ্যাক্সেস করার পরে আপনি আমার অসাধারণ সম্পত্তি, মাইআউভেসের প্যাকেজ সম্পত্তি এবং মাইআউইজেসের ওয়াইল্ডক্লাস সম্পত্তি অ্যাক্সেস করছেন। প্যাকেজ।
স্যামস্টেফেনস

29

নমুনা:

var namespace = {};
namespace.module1 = (function(){

    var self = {};
    self.initialized = false;

    self.init = function(){
        setTimeout(self.onTimeout, 1000)
    };

    self.onTimeout = function(){
        alert('onTimeout')
        self.initialized = true;
    };

    self.init(); /* If it needs to auto-initialize, */
    /* You can also call 'namespace.module1.init();' from outside the module. */
    return self;
})()

আপনি বৈকল্পিকভাবে কোনও localভেরিয়েবল ঘোষণা করতে পারেন same, পছন্দ করতে selfএবং local.onTimeoutএটি ব্যক্তিগত রাখতে চাইলে নির্ধারণ করতে পারেন।


14

নেমস্পেসগুলি সরবরাহ করার জন্য আপনি একটি সাধারণ ক্রিয়াটি ঘোষণা করতে পারেন।

function namespace(namespace) {
    var object = this, tokens = namespace.split("."), token;

    while (tokens.length > 0) {
        token = tokens.shift();

        if (typeof object[token] === "undefined") {
            object[token] = {};
        }

        object = object[token];
    }

    return object;
}

// Usage example
namespace("foo.bar").baz = "I'm a value!";

13

আপনার যদি ব্যক্তিগত সুযোগের প্রয়োজন হয়:

var yourNamespace = (function() {

  //Private property
  var publicScope = {};

  //Private property
  var privateProperty = "aaa"; 

  //Public property
  publicScope.publicProperty = "bbb";

  //Public method
  publicScope.publicMethod = function() {
    this.privateMethod();
  };

  //Private method
  function privateMethod() {
    console.log(this.privateProperty);
  }

  //Return only the public parts
  return publicScope;
}());

yourNamespace.publicMethod();

অন্যথায় যদি আপনি কখনও ব্যক্তিগত সুযোগ ব্যবহার না করেন:

var yourNamespace = {};

yourNamespace.publicMethod = function() {
    // Do something...
};

yourNamespace.publicMethod2 = function() {
    // Do something...
};

yourNamespace.publicMethod();

12

মডিউল প্যাটার্নটি মূলত প্রচলিত সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের ক্লাসগুলির জন্য ব্যক্তিগত এবং পাবলিক উভয় এনক্যাপুলেশন সরবরাহ করার একটি উপায় হিসাবে সংজ্ঞায়িত করা হয়েছিল।

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

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

var myNamespace = (function () {

  var myPrivateVar, myPrivateMethod;

  // A private counter variable
  myPrivateVar = 0;

  // A private function which logs any arguments
  myPrivateMethod = function( foo ) {
      console.log( foo );
  };

  return {

    // A public variable
    myPublicVar: "foo",

    // A public function utilizing privates
    myPublicFunction: function( bar ) {

      // Increment our private counter
      myPrivateVar++;

      // Call our private method using bar
      myPrivateMethod( bar );

    }
  };

})();

সুবিধাদি

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

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

অসুবিধেও

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

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

প্রকাশিত মডিউল প্যাটার্ন

এখন যেহেতু আমরা মডিউল প্যাটার্নটির সাথে আরও কিছুটা বেশি পরিচিত, আসুন এবার কিছুটা উন্নত সংস্করণ - খ্রিস্টান হেলম্যানের প্রকাশিত মডিউল প্যাটার্নটি একবার দেখে নেওয়া যাক।

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

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

প্রকাশিত মডিউল প্যাটার্নটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ নীচে পাওয়া যাবে can

var myRevealingModule = (function () {

        var privateVar = "Ben Cherry",
            publicVar = "Hey there!";

        function privateFunction() {
            console.log( "Name:" + privateVar );
        }

        function publicSetName( strName ) {
            privateVar = strName;
        }

        function publicGetName() {
            privateFunction();
        }


        // Reveal public pointers to
        // private functions and properties

        return {
            setName: publicSetName,
            greeting: publicVar,
            getName: publicGetName
        };

    })();

myRevealingModule.setName( "Paul Kinlan" );

সুবিধাদি

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

অসুবিধেও

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

প্রাইভেট ভেরিয়েবলগুলি উল্লেখ করে এমন পাবলিক অবজেক্টের সদস্যরা উপরের নো-প্যাচ বিধি নোটেরও অধীন।


9

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

এটি একটি বন্ধকে একটি বিশ্বব্যাপী নেমস্পেস দেয় এবং সেই বন্ধের মধ্যে একটি সংজ্ঞায়িত সেট ফাংশন প্রকাশ করে।

(function(){

  namespace("images", previous, next);
  // ^^ This creates or finds a root object, images, and binds the two functions to it.
  // It works even though those functions are not yet defined.

  function previous(){ ... }

  function next(){ ... }

  function find(){ ... } // A private function

})();

8

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

global_namespace.Define('startpad.base', function(ns) {
    var Other = ns.Import('startpad.other');
    ....
});

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

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


1
আমি নেমস্পেস লাইব্রেরির একটি উন্নত সংস্করণ (২.০) তৈরি করেছি: কোড. google.com/p/pagefirest/source/browse/appengine/static/src/…
এমকোসেস

আপনার সমস্ত লিঙ্কগুলি মারা গেছে বলে মনে হচ্ছে
19-29 এ স্নুব কুকুর

8

আমি নেমস্পেসের জন্য নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করি।

var MYNamespace = MYNamespace|| {};

 MYNamespace.MyFirstClass = function (val) {
        this.value = val;
        this.getValue = function(){
                          return this.value;
                       };
    }

var myFirstInstance = new MYNamespace.MyFirstClass(46);
alert(myFirstInstance.getValue());

জেএসফিডেল: http://jsfiddle.net/rpaul/4dngxwb3/1/


8

আমি পার্টিতে 7 বছর দেরি করে ফেলেছি, তবে 8 বছর আগে প্রায় বেশ কিছুটা কাজ করেছি:

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

উপরের দিক থেকে, এটি ছিল আমার চক্র-২০০ solution সমাধান:

var namespace = function(name, separator, container){
  var ns = name.split(separator || '.'),
    o = container || window,
    i,
    len;
  for(i = 0, len = ns.length; i < len; i++){
    o = o[ns[i]] = o[ns[i]] || {};
  }
  return o;
};

এটি কোনও নেমস্পেস তৈরি করছে না, তবে নেমস্পেস তৈরির জন্য একটি ফাংশন সরবরাহ করে।

এটি একটি মিনিফাইড ওয়ান-লাইনারে কনডেন্স করা যায়:

var namespace=function(c,f,b){var e=c.split(f||"."),g=b||window,d,a;for(d=0,a=e.length;d<a;d++){g=g[e[d]]=g[e[d]]||{}}return g};

ব্যবহারের উদাহরণ:

namespace("com.example.namespace");
com.example.namespace.test = function(){
  alert("In namespaced function.");
};

বা, একটি বিবৃতি হিসাবে:

namespace("com.example.namespace").test = function(){
  alert("In namespaced function.");
};

হয় পরে হিসাবে কার্যকর করা হয়:

com.example.namespace.test();

লিগ্যাসি ব্রাউজারগুলির জন্য যদি আপনার প্রয়োজন না হয় তবে একটি আপডেট সংস্করণ:

const namespace = function(name, separator, container){
    var o = container || window;
    name.split(separator || '.').forEach(function(x){
        o = o[x] = o[x] || {};
    });
    return o;
};

এখন, আমি namespaceনিজেই বিশ্বব্যাপী নেমস্পেসে প্রকাশের উদ্রেক করব । (খুব খারাপ ভাষাটি আমাদের পক্ষে এটি সরবরাহ করে না!) সুতরাং আমি সাধারণত এটি নিজেকে বন্ধ করতে ব্যবহার করি, যেমন:

(function(){
	const namespace = function(name, separator, container){
		var o = container || window;
		name.split(separator || '.').forEach(function(x){
			o = o[x] = o[x] || {};
		});
		return o;
	};
	const ns = namespace("com.ziesemer.myApp");
	
	// Optional:
	ns.namespace = ns;
	
	// Further extend, work with ns from here...
}());

console.log("\"com\":", com);

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


2

আমি জ্যাকো প্রিটোরিয়াসের সমাধানটি পছন্দ করি, তবে আমি "এই" কীওয়ার্ডটি মডিউল / নেমস্পেস অবজেক্টের দিকে নির্দেশ করে কিছুটা আরও দরকারী করতে চেয়েছিলাম। আমার স্কিললেট সংস্করণ:

(function ($, undefined) {

    console.log(this);

}).call(window.myNamespace = window.myNamespace || {}, jQuery);

2

আমার প্রিয় প্যাটার্নটি ইদানীং এটি হয়ে গেছে:

var namespace = (function() {
  
  // expose to public
  return {
    a: internalA,
    c: internalC
  }

  // all private
  
  /**
   * Full JSDoc
   */
  function internalA() {
    // ...
  }
  
  /**
   * Full JSDoc
   */
  function internalB() {
    // ...
  }
  
  /**
   * Full JSDoc
   */
  function internalC() {
    // ...
  }
  
  /**
   * Full JSDoc
   */
  function internalD() {
    // ...
  }
  
})();

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

এই জাতীয় ক্ষেত্রে ফাংশন এক্সপ্রেশন ব্যবহার করার ধরণটির ফলে পুরো কোডটি না গিয়ে কী কী পদ্ধতি প্রকাশ করা হবে তা জানতে সক্ষম হবেন না।


হাই, আপনি কীভাবে আপনার স্নিপেট থেকে সর্বজনীন ফাংশনগুলি কল করবেন? আমি চেষ্টা করেছিnamespace.a();
অলিমার্ট

হ্যাঁ, এই ধারণাটি যদিও এখন ES6 এর সাথে, আমি সাধারণত অবজেক্ট লিটারালগুলির শর্টহ্যান্ড সিনট্যাক্স ব্যবহার করি ( ponyfoo.com/articles/es6-object-literal-features-in-dthth )
Nomaded

2

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

namespace => namespace.split(".").reduce((last, next) => (last[next] = (last[next] || {})), window);

এটি চেষ্টা করুন:

// --- definition ---
const namespace = namespace => namespace.split(".").reduce((last, next) => (last[next] = (last[next] || {})), window);

// --- Use ----
let myNamespace = namespace("a.b.c");
myNamespace.MyClass = class MyClass {};

// --- see ----
console.log("a : ", a);


1

যদি কোনও মেকফাইল ব্যবহার করে থাকেন তবে আপনি এটি করতে পারেন।

// prelude.hjs
billy = new (
    function moduleWrapper () {
    const exports = this;

// postlude.hjs
return exports;
})();

// someinternalfile.js
function bob () { console.log('hi'); }
exports.bob = bob;

// clientfile.js
billy.bob();

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

একটি মেকফিল ব্যবহার করার সময় ব্রাউজারে লাইভ বিকাশের জন্য একটি শেল স্ক্রিপ্ট:

while (true); do make; sleep 1; done

এটিকে মেক টাস্ক হিসাবে যান 'যান' এবং আপনার কোডটি কোড হিসাবে আপনার বিল্ডটিকে আপডেট রাখতে আপনি 'মেক' করতে পারেন।


1

আইওনু জি স্ট্যানের উত্তরের যথাযথ অনুসরন, তবে ব্যবহার করে কলহবিহীন কোডের সুবিধাগুলি দেখানো হচ্ছে var ClassFirst = this.ClassFirst = function() {...}যা জাভাস্ক্রিপ্টের ক্লোটারিংয়ের জন্য একই নেমস্পেসের ক্লাসের জন্য কম নেমস্পেসের ক্লোটারিংয়ের জন্য জাভাস্ক্রিপ্টের ক্লোজার স্কোপিংয়ের সুবিধা গ্রহণ করে।

var Namespace = new function() {
    var ClassFirst = this.ClassFirst = function() {
        this.abc = 123;
    }

    var ClassSecond = this.ClassSecond = function() {
        console.log("Cluttered way to access another class in namespace: ", new Namespace.ClassFirst().abc);
        console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
    }
}

var Namespace2 = new function() {
    var ClassFirst = this.ClassFirst = function() {
        this.abc = 666;
    }

    var ClassSecond = this.ClassSecond = function() {
        console.log("Cluttered way to access another class in namespace: ", new Namespace2.ClassFirst().abc);
        console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
    }
}

new Namespace.ClassSecond()
new Namespace2.ClassSecond()

আউটপুট:

Cluttered way to access another class in namespace: 123
Nicer way to access a class in same namespace: 123
Cluttered way to access another class in namespace: 666
Nicer way to access a class in same namespace: 666

1

আমি অন্য একটি নেমস্পেসিং গ্রন্থাগার লিখেছি যা অন্য ভাষায় প্যাকেজ / ইউনিটগুলির মতো আরও কিছুটা কাজ করে। এটি আপনাকে জাভাস্ক্রিপ্ট কোডের একটি প্যাকেজ এবং অন্যান্য কোড থেকে প্যাকেজটি রেফারেন্স তৈরি করতে দেয়:

হ্যালো.জেএস ফাইল করুন

Package("hello", [], function() {
  function greeting() {
    alert("Hello World!");
  }
  // Expose function greeting to other packages
  Export("greeting", greeting);
});

ফাইল উদাহরণ .js

Package("example", ["hello"], function(greeting) {
  // Greeting is available here
  greeting();  // Alerts: "Hello World!"
});

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

আপনি প্যাকেজস জেএস সম্পর্কিত প্রকল্পটি পেতে পারেন ।


1
@ পিটার-মর্টেনসেন '11 সালের উত্তর থেকে এই উত্তরগুলি কি আসলেই প্রয়োজনীয় ছিল? আপনি অবশ্যই যা করছেন তা ভাঙচুর নয়, আমাকে ভুল করবেন না, তবে তারা অত্যন্ত পৃষ্ঠপোষক। আপনি যদি সত্যিই ভাল কিছু না যোগ করেন তবে আমি এ জাতীয় পোস্টগুলির একমাত্র লেখক হিসাবে থাকতে পছন্দ করব।
স্টিজন ডি উইট 21

1

আমরা এটিকে এটি স্বাধীনভাবে ব্যবহার করতে পারি:

var A = A|| {};
A.B = {};

A.B = {
    itemOne: null,
    itemTwo: null,
};

A.B.itemOne = function () {
    //..
}

A.B.itemTwo = function () {
    //..
}

0

আমার অভ্যাসটি হ'ল ফাংশন মাইনেম () সম্পত্তি সংস্থান হিসাবে ব্যবহার করা , এবং তারপরে "পদ্ধতি" ধারক হিসাবে আমার নামটি ...

এটি যথেষ্ট বৈধ কিনা বা না, আমাকে মারধর করুন! আমি আমার পিএইচপি লজিকের উপর সর্বদা ভরসা করছি, এবং জিনিসগুলি সহজভাবে কাজ করে। : ডি

function myObj() {
    this.prop1 = 1;
    this.prop2 = 2;
    this.prop3 = 'string';
}

var myObj = (
 (myObj instanceof Function !== false)
 ? Object.create({

     $props: new myObj(),
     fName1: function() { /* code..  */ },
     fName2: function() { /* code ...*/ }
 })
 : console.log('Object creation failed!')
);

if (this !== that) myObj.fName1(); else myObj.fName2();

অবজেক্ট তৈরির আগে যা যা আরও ভাল তা যাচাই করার আগে আপনি এটি 'বিপরীত' পদ্ধতিতেও করতে পারেন :

function myObj() {
    this.prop1 = 1;
    this.prop2 = 2;
    this.prop3 = 'string';
}

var myObj = (
    (typeof(myObj) !== "function" || myObj instanceof Function === false)
    ? new Boolean()
    : Object.create({
        $props: new myObj(),
        init: function () { return; },
        fName1: function() { /* code..  */ },
        fName2: function() { /* code ...*/ }
    })
);

if (myObj instanceof Boolean) {
    Object.freeze(myObj);
    console.log('myObj failed!');
    debugger;
}
else
    myObj.init();

এর রেফারেন্স: জাভাস্ক্রিপ্ট: অবজেক্ট.ক্রিয়েট () দিয়ে অবজেক্ট তৈরি করা হচ্ছে


0

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

একটি নেমস্পেস নিবন্ধন করুন নীচের একটি নাম স্থান নিবন্ধকরণ ফাংশন

//Register NameSpaces Function
function registerNS(args){
 var nameSpaceParts = args.split(".");
 var root = window;

 for(var i=0; i < nameSpaceParts.length; i++)
 {
  if(typeof root[nameSpaceParts[i]] == "undefined")
   root[nameSpaceParts[i]] = new Object();

  root = root[nameSpaceParts[i]];
 }
}

একটি নেমস্পেস নিবন্ধন করতে কেবল উপরের ফাংশনটি আর্গুমেন্টের সাথে নাম স্পেস '.'(ডট) দ্বারা পৃথক করে কল করুন । উদাহরণস্বরূপ আপনার অ্যাপ্লিকেশনটির নামটি ওডলস দিন। নিম্নলিখিত পদ্ধতি দ্বারা আপনি একটি নেমস্পেস তৈরি করতে পারেন

registerNS("oodles.HomeUtilities");
registerNS("oodles.GlobalUtilities");
var $OHU = oodles.HomeUtilities;
var $OGU = oodles.GlobalUtilities;

মূলত এটি আপনার নেমস্পেস কাঠামোটি নীচের মতো ব্যাকএন্ডে তৈরি করবে:

var oodles = {
    "HomeUtilities": {},
    "GlobalUtilities": {}
};

উপরের ফাংশনে আপনি নামস্থান "oodles.HomeUtilities"এবং নাম নিবন্ধন করেছেন "oodles.GlobalUtilities"। এই নেমস্পেসগুলি কল করতে আমরা একটি ভেরিয়েবল তৈরি করি, যেমন ভেরিও $OHUএবং ভার $OGU

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

$OHU.initialization = function(){
    //Your Code Here
};

উপরে ফাংশন নাম সূচনা হয় এবং এটি একটি নেমস্পেসে স্থাপন করা হয় $OHU। এবং এই ফাংশনটি স্ক্রিপ্ট ফাইলের যে কোনও জায়গায় কল করতে। শুধু নিম্নলিখিত কোড ব্যবহার করুন।

$OHU.initialization();

একইভাবে, অন্য একটি নেমস্পেসের সাথে।

আশা করি এটা সাহায্য করবে.


0

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

function func1() {
    console.log("This is a first definition");

}
function func1() {
    console.log("This is a second definition");
}
func1(); // This is a second definition

এটি সর্বদা দ্বিতীয় ফাংশন সংজ্ঞা কল করে। এই ক্ষেত্রে, নেমস্পেস নামের সংঘর্ষের সমস্যার সমাধান করবে।

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