Java নতুন ফাংশন () Java জাভাস্ক্রিপ্টে লোয়ার কেস "এফ" সহ


106

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

    var someObj = new function () {
        var inner = 'some value';
        this.foo = 'blah';

        this.get_inner = function () {
            return inner;
        };

        this.set_inner = function (s) {
            inner = s;
        };
    };

"এটি" ব্যবহৃত হওয়ার সাথে সাথে এটি কোনও ওজবি'র সর্বজনীন সম্পত্তি হয়ে যায়। সুতরাং someObj.foo, someObj.get_inner () এবং কিছুObj.set_inner () সমস্ত প্রকাশ্যে উপলভ্য। এছাড়াও, সেট_ইনার () এবং get_inner () হ'ল সুবিধাযুক্ত পদ্ধতি, সুতরাং ক্লোজারের মাধ্যমে তাদের "অভ্যন্তরীণ" এ অ্যাক্সেস রয়েছে।

যাইহোক, আমি কোথাও এই কৌশলটির কোনও রেফারেন্স দেখিনি। এমনকি ডগলাস ক্রকফোর্ডের জেএসলিন্টও এ সম্পর্কে অভিযোগ করেছেন:

  • অদ্ভুত নির্মাণ। 'নতুন' মুছুন

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


6
আমি আপনার আইআইএফই ('অবিলম্বে-আমন্ত্রিত ফাংশন') এর চেয়ে বেশি নির্মাণকে পছন্দ করি। 1: আপনার স্পষ্টরূপে 'উদাহরণ' অবজেক্টের দরকার নেই, এটি জাভাস্ক্রিপ্টে ঠিক 'এটি' রয়েছে। 2: আপনাকে কোনও কিছু ফেরত দেওয়ার দরকার নেই, যার অর্থ, আপনার মনে রাখার দরকার নেই। এমনকি গৃহীত উত্তরের লেখক প্রাথমিকভাবে উদাহরণটি ফিরিয়ে দিতে ভুলে গেছেন! লোকেরা সাধারণত কোনও আইআইএফই ব্যবহার করতে পছন্দ করে যদি তারা নতুনকে ঘৃণা করে এবং এটি যুক্তিসঙ্গত কারণ সহ - যদি আপনার কোনও ডিওএম ইভেন্ট পরিচালনার কোনও ফাংশন থাকে thisতবে আপনার উপাদানটি নয়, ইভেন্টটি বরখাস্তকারী উপাদানটিকে উল্লেখ করবে তবে আপনি কেবল তার var instance = thisপরিবর্তে থাকতে পারেন ।
লি কোয়ালকভস্কি

1
"লোয়ার কেস এফ" নির্দিষ্ট করা কেন এই প্রশ্নের গুরুত্বপূর্ণ?
ক্লিয়ারক্লাউড 8

7
কারণ জাভাস্ক্রিপ্টে 'ফাংশন' ফাংশন (বড় হাতের এফ সহ) রয়েছে, যা পৃথক: ফাংশন একটি কনস্ট্রাক্টর ফাংশন যা নতুন ফাংশন অবজেক্ট তৈরি করতে পারে, যেখানে ফাংশনটি একটি কীওয়ার্ড।
স্টিজন ডি উইট


@ বেরগি আমি আপনার লিঙ্কগুলি পড়েছি। আমি এই প্যাটার্নটিকে অপমান করার কোনও কারণ দেখতে পাচ্ছি না। এটা বৈধ। ইহা সহজ. তাহলে কি ভুল হয়েছে। জেএসলিন্ট বিটিডাব্লু সব বিষয়ে অভিযোগ করেছেন :)
স্টিজন ডি উইট

উত্তর:


64

আমি আগে এই কৌশলটি দেখেছি, এটি বৈধ, আপনি কোনও ফাংশন এক্সপ্রেশনটি ব্যবহার করছেন যেন এটি কোনও কনস্ট্রাক্টর ফাংশন

তবে আইএমএইচও, আপনি একটি স্বয়ংক্রিয়-আমন্ত্রণমূলক ফাংশন এক্সপ্রেশন দিয়ে এটি অর্জন করতে পারেন, আমি newঅপারেটরটিকে সেভাবে ব্যবহার করার দিকটি সত্যই দেখতে পাচ্ছি না :

var someObj = (function () {
    var instance = {},
        inner = 'some value';

    instance.foo = 'blah';

    instance.get_inner = function () {
        return inner;
    };

    instance.set_inner = function (s) {
        inner = s;
    };

    return instance;
})();

newঅপারেটরের উদ্দেশ্য হ'ল নতুন অবজেক্ট ইনস্ট্যান্স তৈরি করা, [[Prototype]]অভ্যন্তরীণ সম্পত্তি সেটআপ করা , আপনি দেখতে পাচ্ছেন যে এটি কীভাবে [Construct]অভ্যন্তরীণ সম্পত্তি দ্বারা তৈরি হয় ।

উপরের কোডটি একটি সমমানের ফলাফল উত্পন্ন করবে।


1
13 সেকশনের ECMAScript 262 স্পেসিফিকেশন এটিকে আরও কিছুটা আনুষ্ঠানিকভাবে ব্যাখ্যা করেছে। এরকম কিছু function foo () {}আবার কোনও Functionবস্তু তৈরির ফলাফল প্রদান করে [সম্ভবত নতুন ফাংশন () দিয়ে]। এটি সিনট্যাক্স চিনি।
ক্লিনটন পিয়ার্স

3
আমি মনে করি আপনি return instance;শেষে একটি অনুপস্থিত । অন্যথায়, someObjঠিক হবে undefined। :-)
ম্যাথু ক্রামলে

1
আমি কি প্রস্তাব দিতে পারি যে আপনি যদি মডুলারালিটি এবং তথ্য গোপনের বিষয়ে যত্নশীল হন তবে আপনি কেবল এটি ছেড়ে দিয়ে প্রয়োজনীয়.js এর মতো কিছু ব্যবহার শুরু করেন? আপনি অর্ধেক সেখানে আছেন, এখানে কেন থামবেন? অ্যাসিঙ্ক্রোনাস মডিউল সংজ্ঞা (যা এটি প্রয়োজন।
স্টিজন ডি উইট

নোট করুন যে ফাংশন ঘোষণার চারপাশে প্রথম বন্ধনী অপ্রয়োজনীয় যেহেতু বক্তব্যটি উপস্থিতির কারণে ইতিমধ্যে একটি অভিব্যক্তি=
এক্সপ্লোশন পিলস

@ স্টিজেডেভিট অর্ধেকভাবে এর মানে হল যে আপনি প্রয়োজন.জেএস ব্যবহার করতে দ্বিগুণ কাজ করতে হবে তবে সাধারণ ক্ষেত্রে আপনার যা প্রয়োজন তা হতে পারে।
xr280xr

15

আপনার কোডটি কম অদ্ভুত নির্মাণের মতোই

function Foo () {
    var inner = 'some value';
    this.foo = 'blah';

    ...
};
var someObj = new Foo;

9
এটি ঠিক একই রকম নয়, এটি ঠিক একই জিনিসটি করে ... একমাত্র ব্যতিক্রম ছাড়া তারা অন্য কোনও বস্তু তৈরির জন্য ফুকে পুনরায় ব্যবহার করতে সক্ষম হবে না।
কিকিতো

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

@ কিকিতো আপনার অর্থ কি এইটিকে অন্য কোনও বস্তু তৈরি করার জন্য ফুকে পুনরায় ব্যবহার করার অনুমতি দেয় না? var newObj = নতুন ফু () একটি নতুন উদাহরণ তৈরি করা উচিত।
বিল ইয়াং

1
@ বিলিয়্যাং যা 5 বছর আগে ছিল। কোন ধারনা নাই. আমি তখন থেকে জাভাস্ক্রিপ্ট স্পর্শ করিনি।
কিকিতো

12

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

1. o = new Object(); // normal call of a constructor

2. o = new Object;   // accepted call of a constructor

3. var someObj = new (function () {  
    var inner = 'some value';
    this.foo = 'blah';

    this.get_inner = function () {
        return inner;
    };

    this.set_inner = function (s) {
        inner = s;
    };
})(); // normal call of a constructor

4. var someObj = new (function () {  
    var inner = 'some value';
    this.foo = 'blah';

    this.get_inner = function () {
        return inner;
    };

    this.set_inner = function (s) {
        inner = s;
    };
}); // accepted call of a constructor

উদাহরণস্বরূপ 3. মান হিসাবে (...) এক্সপ্রেশন একটি ফাংশন / কনস্ট্রাক্টর হয়। এটি এর মতো দেখাচ্ছে: নতুন (ফাংশন () {...}) ()। সুতরাং আমরা উদাহরণস্বরূপ 2 হিসাবে শেষ বন্ধনীগুলি বাদ দিলে এক্সপ্রেশনটি এখনও একটি বৈধ নির্মাণকারী কল এবং উদাহরণ 4 এর মতো দেখায়।

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

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