জাভাস্ক্রিপ্ট ব্যক্তিগত পদ্ধতি


482

একটি পাবলিক পদ্ধতিতে একটি জাভাস্ক্রিপ্ট ক্লাস করতে আমি এই জাতীয় কিছু করব:

function Restaurant() {}

Restaurant.prototype.buy_food = function(){
   // something here
}

Restaurant.prototype.use_restroom = function(){
   // something here
}

আমার শ্রেণীর ব্যবহারকারীরা সেভাবে করতে পারেন:

var restaurant = new Restaurant();
restaurant.buy_food();
restaurant.use_restroom();

আমি কীভাবে এমন একটি ব্যক্তিগত পদ্ধতি তৈরি করব যা ক্লাসের ব্যবহারকারীদের দ্বারা বাহ্যিকভাবে নয় তবে পদ্ধতিগুলি buy_foodএবং use_restroomপদ্ধতিগুলি দ্বারা কল করা যায় ?

অন্য কথায়, আমি চাই আমার পদ্ধতিটি বাস্তবায়ন করতে সক্ষম হবে:

Restaurant.prototype.use_restroom = function() {
   this.private_stuff();
}

তবে এটি কাজ করা উচিত নয়:

var r = new Restaurant();
r.private_stuff();

আমি কীভাবে private_stuffএকটি ব্যক্তিগত পদ্ধতি হিসাবে সংজ্ঞা দেব না কেন এই উভয়ই সঠিক?

আমি ডগ ক্রকফোর্ডের রাইটআপটি কয়েকবার পড়েছি তবে মনে হয় না যে "ব্যক্তিগত" পদ্ধতিগুলি পাবলিক পদ্ধতিতে বলা যেতে পারে এবং "সুবিধাপ্রাপ্ত" পদ্ধতিগুলি বাহ্যিকভাবে বলা যেতে পারে।

উত্তর:


403

আপনি এটি করতে পারেন, তবে খারাপ দিকটি এটি প্রোটোটাইপের অংশ হতে পারে না:

function Restaurant() {
    var myPrivateVar;

    var private_stuff = function() {  // Only visible inside Restaurant()
        myPrivateVar = "I can set this here!";
    }

    this.use_restroom = function() {  // use_restroom is visible to all
        private_stuff();
    }

    this.buy_food = function() {   // buy_food is visible to all
        private_stuff();
    }
}

9
বন্ধের ভিতরে থিনগুলি গোপন করা সমস্ত দোভাষীদের গোপনীয়তার নিশ্চয়তা দেয় না। কোড. google.com/p/google-caja/wiki/…
মাইক স্যামুয়েল

51
@ মাইকসামুয়েল - সত্য, তবে কেবল তখনই যখন তাদের
অনুবাদকদের

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

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

68
ব্যক্তিগত পদ্ধতিগুলি ওভাররাইড হওয়ার কথা নয় - এগুলি ব্যক্তিগত।
26 এর 26

163

স্ব-চালিত ফাংশন এবং কল ব্যবহার করে

জাভাস্ক্রিপ্ট প্রোটোটাইপ ব্যবহার করে এবং অবজেক্ট ওরিয়েন্টেড ভাষার মতো ক্লাস (বা সেই বিষয়ে পদ্ধতি) নেই। একজন জাভাস্ক্রিপ্ট বিকাশকারীকে জাভাস্ক্রিপ্টে ভাবতে হবে।

উইকিপিডিয়া উদ্ধৃতি:

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

ব্যক্তিগতকে "পদ্ধতি" কল করার জন্য একটি স্ব- আমন্ত্রণমূলক ফাংশন এবং কল ফাংশন ব্যবহার করে সমাধান :

var MyObject = (function () {

    // Constructor
    function MyObject (foo) {
        this._foo = foo;
    }

    function privateFun (prefix) {
        return prefix + this._foo;
    }

    MyObject.prototype.publicFun = function () {
        return privateFun.call(this, '>>');
    }

    return MyObject;
})();


var myObject = new MyObject('bar');
myObject.publicFun();      // Returns '>>bar'
myObject.privateFun('>>'); // ReferenceError: private is not defined

কল ফাংশন আমাদের উপযুক্ত প্রসঙ্গকে ব্যক্তিগত ফাংশন কল করার অনুমতি দেয় ( this)।


নোড.জেএস সহ সহজ

আপনি যদি নোড.জেএস ব্যবহার করে থাকেন তবে আপনার আইআইএফই দরকার নেই কারণ আপনি মডিউল লোডিং সিস্টেমটির সুবিধা নিতে পারেন :

function MyObject (foo) {
    this._foo = foo;
}

function privateFun (prefix) {
    return prefix + this._foo;
}

MyObject.prototype.publicFun = function () {
    return privateFun.call(this, '>>');
}

exports.MyObject = MyObject;

ফাইলটি লোড করুন:

var MyObject = require('./MyObject').MyObject;

var myObject = new MyObject('bar');
myObject.publicFun();      // Returns '>>bar'
myObject.privateFun('>>'); // ReferenceError: private is not defined


(পরীক্ষামূলক) বাইন্ড অপারেটরের সাথে ES7

বাইন্ড অপারেটর ::একটি ECMAScript প্রস্তাব এবং বাবেলে প্রয়োগ করা হয় ( পর্যায় 0 )।

export default class MyObject {
  constructor (foo) {
    this._foo = foo;
  }

  publicFun () {
    return this::privateFun('>>');
  }
}

function privateFun (prefix) {
  return prefix + this._foo;
}

ফাইলটি লোড করুন:

import MyObject from './MyObject';

let myObject = new MyObject('bar');
myObject.publicFun();      // Returns '>>bar'
myObject.privateFun('>>'); // TypeError: myObject.privateFun is not a function

34
এটি সেরা উত্তর। ব্যক্তিগত পদ্ধতিগুলির সুবিধা, কোনও জঞ্জাল নয়।
টেলরম্যাক

1
@TaylorMac ছাড়া .callঅংশ।
pishpish

1
@ জঞ্জে হাহ? এটাই প্রশ্নের মূল বিষয়, f()জাভাস্ক্রিপ্টে কোনও ব্যক্তিগত নেই (এই মুহুর্তে নয়)।
ইয়ভেস এম

2
@YvesM। প্রশ্নের বিন্দুটি সেরা প্যাটার্ন চয়ন করছে যা এটির অনুকরণ করে।
pishpish

1
@ লুকিয়ে ফাংশন (বাইরে থেকে কলযোগ্য নয়), সুন্দর সিনট্যাক্স (না .call) এবং ছোট মেমোরি (উদাহরণস্বরূপ কোনও কার্যকারিতা নেই ) রাখার জন্য সর্বোত্তম সমঝোতা কী তা পরিবর্তিত হয়েছে ? তাও কি বিদ্যমান?
সিপরিয়ান টোমাইয়াজি

161

আপনি এই জাতীয় ব্যক্তিগত পদ্ধতি অনুকরণ করতে পারেন:

function Restaurant() {
}

Restaurant.prototype = (function() {
    var private_stuff = function() {
        // Private code here
    };

    return {

        constructor:Restaurant,

        use_restroom:function() {
            private_stuff();
        }

    };
})();

var r = new Restaurant();

// This will work:
r.use_restroom();

// This will cause an error:
r.private_stuff();

এই কৌশল সম্পর্কে আরও তথ্য এখানে: http://webreflection.blogspot.com/2008/04/n Natural-javascript-private-methods.html


7
আমি ডগলাস ক্রকফোর্ডের সাইটটি ব্যক্তিগত / জনসাধারণের পদ্ধতি এবং সদস্যদের জাভাস্ক্রিপ্ট.ক্রকফোর্ড.com
জেয়ার্ড

10
প্রশ্নে তিনি সেই লিঙ্কটি উল্লেখ করেছিলেন।
গুলজার নাজিম

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

6
এটি সমাধান এবং স্বীকৃত উত্তর হওয়া উচিত কারণ লেখক স্পষ্টভাবে প্রোটোটাইপ সম্পত্তি ব্যবহার করছেন।
গ্যাব্রিয়েল লালামাস

23
প্যাটার্ন সঙ্গে @georgebrock দ্বারা প্রস্তাবিত, সব ব্যক্তিগত ডেটাতে মধ্যে ভাগ করা হবে সব রেস্টুরেন্টে বস্তু। এটি ক্লাস ভিত্তিক ওওপি-তে স্থিতিশীল প্রাইভেট ভেরিয়েবল এবং ফাংশনের অনুরূপ। আমি ধরে নিই যে ওপি এটি চায় না । উদাহরণ হিসেবে বলা যায় আমি কি বলতে চাচ্ছি, আমি তৈরি একটি jsFiddle
ফিকলি

35

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

http://yuiblog.com/blog/2007/06/12/module-pattern/

অন্যান্য বিকাশকারীদের বোঝা এটি সত্যই সোজা এবং সহজ। একটি সাধারণ উদাহরণের জন্য:

var MYLIB = function() {  
    var aPrivateProperty = true;
    var aPrivateMethod = function() {
        // some code here...
    };
    return {
        aPublicMethod : function() {
            aPrivateMethod(); // okay
            // some code here...
        },
        aPublicProperty : true
    };  
}();

MYLIB.aPrivateMethod() // not okay
MYLIB.aPublicMethod() // okay

এই জাতীয় জিনিসটি কোনও
আইডিইয়ের

19
তবে এটি কোনও শ্রেণি নয় তাই আপনার বিভিন্ন রাজ্যের সাথে এটির 2 "উদাহরণ" থাকতে পারে না।
ডিভানটোইন

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

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

মত ব্যক্তিগত ফাংশন ফলে জনসাধারণের ভেরিয়েবল কলিং কোনো downside হয়, তাই: aPrivateMethod = function() { MYLIB.aPublicProperty}?
হান্না

21

এখানে ডগলাস ক্রকফোর্ড জাভাস্ক্রিপ্টের ব্যক্তিগত সদস্যদের মধ্যে কী পরামর্শ দিয়েছে তা বোঝার জন্য আমি এখানে বর্গ তৈরি করেছি

function Employee(id, name) { //Constructor
    //Public member variables
    this.id = id;
    this.name = name;
    //Private member variables
    var fName;
    var lName;
    var that = this;
    //By convention, we create a private variable 'that'. This is used to     
    //make the object available to the private methods. 

    //Private function
    function setFName(pfname) {
        fName = pfname;
        alert('setFName called');
    }
    //Privileged function
    this.setLName = function (plName, pfname) {
        lName = plName;  //Has access to private variables
        setFName(pfname); //Has access to private function
        alert('setLName called ' + this.id); //Has access to member variables
    }
    //Another privileged member has access to both member variables and private variables
    //Note access of this.dataOfBirth created by public member setDateOfBirth
    this.toString = function () {
        return 'toString called ' + this.id + ' ' + this.name + ' ' + fName + ' ' + lName + ' ' + this.dataOfBirth; 
    }
}
//Public function has access to member variable and can create on too but does not have access to private variable
Employee.prototype.setDateOfBirth = function (dob) {
    alert('setDateOfBirth called ' + this.id);
    this.dataOfBirth = dob;   //Creates new public member note this is accessed by toString
    //alert(fName); //Does not have access to private member
}
$(document).ready()
{
    var employee = new Employee(5, 'Shyam'); //Create a new object and initialize it with constructor
    employee.setLName('Bhaskar', 'Ram');  //Call privileged function
    employee.setDateOfBirth('1/1/2000');  //Call public function
    employee.id = 9;                     //Set up member value
    //employee.setFName('Ram');  //can not call Private Privileged method
    alert(employee.toString());  //See the changed object

}

5
এটি = এটি এমন একটি প্যাটার্ন যা সাধারণভাবে প্রচলিত, তাঁর "জাভাস্ক্রিপ্ট: ভাল অংশগুলি" বইটিতে পূর্বোক্ত ক্রোকফোর্ড জনপ্রিয় করেছেন
অলিগোফ্রেন

8
thatthisস্কোপিং সমস্যাগুলি এড়ানোর পরিবর্তে ব্যবহৃত হয় , যখন ফাংশনগুলি কোনও ভিন্ন অবজেক্টের সাথে আবদ্ধ থাকে। এখানে আপনি সঞ্চয় thisকরছেন thatএবং এটি আর কখনও ব্যবহার করবেন না যা এটি একেবারেই না করার মতো। আপনার সমস্ত অভ্যন্তরীণ ফাংশনগুলির thisসাথে পরিবর্তিত হওয়া উচিত (পদ্ধতিগুলির ঘোষণা নয়)। যদি হয় ed বা কোনো না কোনোভাবে ed এই পদ্ধতি যেহেতু ফেলে দিতে পারে ভুল আবদ্ধ করা হবে না। thatConstructoremployeeapplycallthis
মারোশিই

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

এতে "কনস্ট্রাক্টর" পদ্ধতিটি কোথায়? তাত্ক্ষণিকভাবে যখন ক্লাসের কনস্ট্রাক্টর পদ্ধতিতে কার্যকর করা হয় তখন আমি যুক্তিটি কোথায় রাখব?
BadHorsie

13

আমি এটি জেনেছি: সম্পাদনা: আসলে, কেউ একটি অভিন্ন সমাধানের সাথে লিঙ্ক করেছে। Duh!

var Car = function() {
}

Car.prototype = (function() {
    var hotWire = function() {
        // Private code *with* access to public properties through 'this'
        alert( this.drive() ); // Alerts 'Vroom!'
    }

    return {
        steal: function() {
            hotWire.call( this ); // Call a private method
        },
        drive: function() {
            return 'Vroom!';
        }
    };
})();

var getAwayVechile = new Car();

hotWire(); // Not allowed
getAwayVechile.hotWire(); // Not allowed
getAwayVechile.steal(); // Alerts 'Vroom!'

1
এটি একটি দুর্দান্ত কৌশল, তবে আপনি কীভাবে আপনার নির্মাণকারীর পরামিতিগুলিকে অনুমতি দেবেন? উদাহরণস্বরূপ গতি var getAwayVehicle = new Car(100);কোথায় 100এবং আপনি গতি সতর্ক করতে চান। ধন্যবাদ!
জেসন

1
এটি বের করে দেখিয়েছি, নির্মাতারা থাকতে পারেন var Car = function(speed) { this.speed = speed; }এবং করতে পারেন : গাড়ি, ... `
জেসন

11

আমি মনে করি বন্ধগুলি বোঝার অভাবের কারণে এই জাতীয় প্রশ্নগুলি বারবার আসে। বন্ধ জেএস মধ্যে সবচেয়ে গুরুত্বপূর্ণ জিনিস। প্রতিটি জেএস প্রোগ্রামারকে এর মর্ম অনুভব করতে হবে।

1. সবার আগে আমাদের আলাদা স্কোপ (ক্লোজার) করা দরকার।

function () {

}

২. এই ক্ষেত্রে আমরা যা চাই তা করতে পারি। এবং এটি সম্পর্কে কেউ জানতে পারবে না।

function () {
    var name,
        secretSkills = {
            pizza: function () { return new Pizza() },
            sushi: function () { return new Sushi() }
        }

    function Restaurant(_name) {
        name = _name
    }
    Restaurant.prototype.getFood = function (name) {
        return name in secretSkills ? secretSkills[name]() : null
    }
}

৩. আমাদের রেস্তোঁরা ক্লাস সম্পর্কে বিশ্বকে জানতে, আমাদের এটি বন্ধ থেকে ফিরে আসতে হবে।

var Restaurant = (function () {
    // Restaurant definition
    return Restaurant
})()

৪. শেষে, আমাদের আছে:

var Restaurant = (function () {
    var name,
        secretSkills = {
            pizza: function () { return new Pizza() },
            sushi: function () { return new Sushi() }
        }

    function Restaurant(_name) {
        name = _name
    }
    Restaurant.prototype.getFood = function (name) {
        return name in secretSkills ? secretSkills[name]() : null
    }
    return Restaurant
})()

৫. এছাড়াও, এই পদ্ধতির উত্তরাধিকার এবং টেম্প্লেটিংয়ের সম্ভাবনা রয়েছে

// Abstract class
function AbstractRestaurant(skills) {
    var name
    function Restaurant(_name) {
        name = _name
    }
    Restaurant.prototype.getFood = function (name) {
        return skills && name in skills ? skills[name]() : null
    }
    return Restaurant
}

// Concrete classes
SushiRestaurant = AbstractRestaurant({ 
    sushi: function() { return new Sushi() } 
})

PizzaRestaurant = AbstractRestaurant({ 
    pizza: function() { return new Pizza() } 
})

var r1 = new SushiRestaurant('Yo! Sushi'),
    r2 = new PizzaRestaurant('Dominos Pizza')

r1.getFood('sushi')
r2.getFood('pizza')

আমি আশা করি এটি এই বিষয়টিকে আরও ভালভাবে বুঝতে সহায়তা করে


2
৪. পয়েন্টে আপনার যা আছে তা দুর্দান্ত! আমি মনে করি যে এখানকার সকলের কাছ থেকে এটিই একমাত্র উত্তর যেখানে আপনি উভয়ই প্রোটোটাইপের পদ্ধতি ব্যবহারের কর্মক্ষমতা / স্মৃতি লাভ এবং এই পাবলিক পদ্ধতিতে ব্যক্তিগত সদস্যদের সম্পূর্ণ অ্যাক্সেস রয়েছে। +1
হুডন

7
এটি কাজ করে না। এখানে নাম ভেরিয়েবল স্থিতিশীল ভেরিয়েবলের মতো কাজ করে এবং রেস্তোঁরাটির সমস্ত দৃষ্টান্ত দ্বারা ভাগ করা হয়। এখানে jsbin: jsbin.com/oqewUWa/2/edit?js,output
শীতল শাহ

এটি একটি ভাল চেষ্টা, তবে শীতল উল্লেখ করেছেন যে নাম পরিবর্তনশীল বগি g
অলিগোফ্রেন

2
আমার 2c এখানে যুক্ত করে এটি পুনরায় নিশ্চিত করার জন্য এটি কাজ করে না, দেখতে দুর্দান্ত দেখাচ্ছে, তবে উপরে উল্লিখিত "নাম "টি স্থির পরিবর্তনশীল হিসাবে কাজ করবে অর্থাৎ সমস্ত দৃষ্টান্তে ভাগ করে নেওয়া হয়েছে
পল ক্যারল

10

ব্যক্তিগতভাবে, আমি জাভাস্ক্রিপ্টে ক্লাস তৈরি করার জন্য নিম্নলিখিত প্যাটার্নটি পছন্দ করি:

var myClass = (function() {
    // Private class properties go here

    var blueprint = function() {
        // Private instance properties go here
        ...
    };

    blueprint.prototype = { 
        // Public class properties go here
        ...
    };

    return  {
         // Public class properties go here
        create : function() { return new blueprint(); }
        ...
    };
})();

আপনি দেখতে পাচ্ছেন, এটি আপনাকে শ্রেণীর বৈশিষ্ট্য এবং দৃষ্টান্তের বৈশিষ্ট্যগুলি উভয়ই সংজ্ঞায়িত করতে দেয়, যার প্রত্যেকটি সরকারী এবং ব্যক্তিগত হতে পারে।


ডেমো

var Restaurant = function() {
    var totalfoodcount = 0;        // Private class property
    var totalrestroomcount  = 0;   // Private class property
    
    var Restaurant = function(name){
        var foodcount = 0;         // Private instance property
        var restroomcount  = 0;    // Private instance property
        
        this.name = name
        
        this.incrementFoodCount = function() {
            foodcount++;
            totalfoodcount++;
            this.printStatus();
        };
        this.incrementRestroomCount = function() {
            restroomcount++;
            totalrestroomcount++;
            this.printStatus();
        };
        this.getRestroomCount = function() {
            return restroomcount;
        },
        this.getFoodCount = function() {
            return foodcount;
        }
    };
   
    Restaurant.prototype = {
        name : '',
        buy_food : function(){
           this.incrementFoodCount();
        },
        use_restroom : function(){
           this.incrementRestroomCount();
        },
        getTotalRestroomCount : function() {
            return totalrestroomcount;
        },
        getTotalFoodCount : function() {
            return totalfoodcount;
        },
        printStatus : function() {
           document.body.innerHTML
               += '<h3>Buying food at '+this.name+'</h3>'
               + '<ul>' 
               + '<li>Restroom count at ' + this.name + ' : '+ this.getRestroomCount() + '</li>'
               + '<li>Food count at ' + this.name + ' : ' + this.getFoodCount() + '</li>'
               + '<li>Total restroom count : '+ this.getTotalRestroomCount() + '</li>'
               + '<li>Total food count : '+ this.getTotalFoodCount() + '</li>'
               + '</ul>';
        }
    };

    return  { // Singleton public properties
        create : function(name) {
            return new Restaurant(name);
        },
        printStatus : function() {
          document.body.innerHTML
              += '<hr />'
              + '<h3>Overview</h3>'
              + '<ul>' 
              + '<li>Total restroom count : '+ Restaurant.prototype.getTotalRestroomCount() + '</li>'
              + '<li>Total food count : '+ Restaurant.prototype.getTotalFoodCount() + '</li>'
              + '</ul>'
              + '<hr />';
        }
    };
}();

var Wendys = Restaurant.create("Wendy's");
var McDonalds = Restaurant.create("McDonald's");
var KFC = Restaurant.create("KFC");
var BurgerKing = Restaurant.create("Burger King");

Restaurant.printStatus();

Wendys.buy_food();
Wendys.use_restroom();
KFC.use_restroom();
KFC.use_restroom();
Wendys.use_restroom();
McDonalds.buy_food();
BurgerKing.buy_food();

Restaurant.printStatus();

BurgerKing.buy_food();
Wendys.use_restroom();
McDonalds.buy_food();
KFC.buy_food();
Wendys.buy_food();
BurgerKing.buy_food();
McDonalds.buy_food();

Restaurant.printStatus();

আরও দেখুন এই বেহালার


এটি আমাকে এস classes ক্লাস ব্যবহার করতে এবং এটি কী কী পরিবহন করে তা দেখতে চায়
শেরিফডেরেক

9

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


34
কে গুরুত্ব দিচ্ছে?
এখন

17
যে 9% এখনও আই 6 ব্যবহার করে তা গতি, অনুকূলিতকরণ এবং সমস্ত আধুনিক এইচটিএমএল 5 বৈশিষ্ট্যগুলির যত্ন করে না। সুতরাং ক্লোজারগুলির কোনও মূল্য হবে না।
গ্যাব্রিয়েল লালামাস

6
এটা তোলে 0.5% এখন (আগস্ট 2012) হয় w3schools.com/browsers/browsers_explorer.asp
Lorenzo, Polidori

7
@ লোরেঞ্জো পোলিডোরি ডাব্লু 3 স্কুল স্কুল ব্যবহারকারী! == কর্পোরেট ওয়েব ব্যবহারকারী;]
WynandB

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

5

এত ভার্বোস হয়ে উঠবেন না। এটি জাভাস্ক্রিপ্ট। একটি নামকরণ কনভেনশন ব্যবহার করুন ।

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

  1. জাভাস্ক্রিপ্টের মতো স্কোপ কীওয়ার্ড নেই private । জাভাস্ক্রিপ্টে প্রবেশকারী অন্যান্য বিকাশকারীরা এই সম্মুখভাগটি জানবেন। সুতরাং, একটি সাধারণ নামকরণ কনভেনশন পর্যাপ্ত চেয়ে বেশি। আন্ডারস্কোরের সাথে উপসর্গের একটি সহজ নামকরণ কনভেনশন ব্যক্তিগত সম্পত্তি এবং ব্যক্তিগত পদ্ধতি উভয়েরই সমস্যা সমাধান করে।
  2. আসুন গতির কারণে প্রোটোটাইপটির সুবিধাটি নেওয়া যাক তবে এর চেয়ে আর ভার্বোস না পাওয়া যাক। আসুন আমরা অন্যান্য ব্যাকএন্ডের ভাষাগুলিতে কী আশা করতে পারি তার দিকে ঘনিষ্ঠভাবে দেখার জন্য es5 "শ্রেণি" রাখার চেষ্টা করি (এবং প্রতিটি ফাইলকে ক্লাস হিসাবে বিবেচনা করুন, এমনকি আমাদের কোনও উদাহরণ ফেরত দেওয়ার দরকার না পড়লেও)।
  3. আসুন আমরা আরও বাস্তবসম্মত মডিউল পরিস্থিতি নিয়ে প্রদর্শিত করব (আমরা পুরানো এস 5 এবং পুরানো প্রয়োজনীয় জেএসগুলি ব্যবহার করব)।

আমার-tooltip.js

    define([
        'tooltip'
    ],
    function(
        tooltip
    ){

        function MyTooltip() {
            // Later, if needed, we can remove the underscore on some
            // of these (make public) and allow clients of our class
            // to set them.
            this._selector = "#my-tooltip"
            this._template = 'Hello from inside my tooltip!';
            this._initTooltip();
        }

        MyTooltip.prototype = {
            constructor: MyTooltip,

            _initTooltip: function () {
                new tooltip.tooltip(this._selector, {
                    content: this._template,
                    closeOnClick: true,
                    closeButton: true
                });
            }
        }

        return {
            init: function init() {
               new MyTooltip();  // <-- Our constructor adds our tooltip to the DOM so not much we need to do after instantiation.
            }

            // You could instead return a new instantiation, 
            // if later you do more with this class.
            /* 
            create: function create() {
               return new MyTooltip();
            }
            */
        }
    });

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

আমি কি এটি তৈরিতে ভাল রেফারেন্স চাইতে পারি? এই উদাহরণে কিছু অংশ আমার কাছে নতুন। defineএবং constructorএবং গঠন নিজেই। যদিও আমি বেশিরভাগ উত্তরের সাথে একমত হয়েছি, আমি জেএসের সাথে প্রচুর ওওপি প্রভাব নিয়ে কাজ শুরু করেছি এবং সিএস-এর পূর্ব অভিজ্ঞতা থাকার পরেও টিএসে খুব তাড়াতাড়ি ঝাঁপিয়ে পড়েছি। আমি মনে করি আমাকে এই জিনিসগুলি আনার্ন করতে হবে এবং প্রোটোটাইপিং / পদ্ধতিগত দৃষ্টান্তটি বুঝতে হবে। (upvated, btw)
শীতল Cerberus

1
এই কোড স্নিপেট এসএস 5 ব্যবহার করছে আপনি এই পদ্ধতির একটি সম্পূর্ণ ছবি এখানে দেখতে পারেন: gist.github.com/jonnyreeves/2474026 । কিন্তু মনে রাখা, আপনি এই অভিগমন এবং es6 শ্রেণীর ব্যবহার করতে এটি আপডেট করতে চাইবেন googlechrome.github.io/samples/classes-es6 এবং es6 মডিউল (আমদানি / রপ্তানি সিনট্যাক্স): hackernoon.com/...
prograhammer

5

আপনি এখন এস 10 বেসরকারী পদ্ধতিতে এটি করতে পারেন#পদ্ধতির নামের আগে আপনাকে কেবল একটি যুক্ত করতে হবে ।

class ClassWithPrivateMethod {
  #privateMethod() {
    return 'hello world';
  }

  getPrivateMessage() {
    return #privateMethod();
  }
}

2
এটি ব্যতীত পর্যায় 3 এবং এখনও সরকারীভাবে ভাষার অংশ নয়।
misterhtmlcss

3

সমাধান যে Crockford এর অনুসরণ কোন নিন ব্যক্তিগত বা priviledged প্যাটার্ন। উদাহরণ স্বরূপ:

function Foo(x) {
    var y = 5;
    var bar = function() {
        return y * x;
    };

    this.public = function(z) {
        return bar() + x * z;
    };
}

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

eval("Foo = " + Foo.toString().replace(
    /{/, "{ this.eval = function(code) { return eval(code); }; "
));

নোট করুন যে উপরের কোডটি সমস্ত কনস্ট্রাক্টর-টাইপ-গোপনীয়তার জন্য জেনেরিক। এটি এখানে কিছু সমাধানের সাথে ব্যর্থ হবে তবে এটি পরিষ্কার হওয়া উচিত যে ক্লোজার ভিত্তিক সমাধানগুলি সমস্তরকম আলাদা করে এইভাবে ভেঙে যেতে পারেreplace() পরামিতিগুলির ।

এটি কার্যকর হওয়ার পরে যা দিয়ে তৈরি কোনও অবজেক্টের new Foo()এমন একটি evalপদ্ধতি রয়েছে যা কনস্ট্রাক্টরের ক্লোজারে সংজ্ঞায়িত মান বা পদ্ধতিগুলি পরিবর্তন করতে বা পরিবর্তন করতে বলা যেতে পারে, যেমন:

f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");

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

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

আমি সাধারণত চিহ্নিতকরণ __privateএবং _protectedপদ্ধতি এবং ক্ষেত্রগুলিতে (পার্ল শৈলী) শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করি তবে জাভাস্ক্রিপ্টে গোপনীয়তা রাখার ধারণাটি দেখায় যে এটি কীভাবে একটি ভুল বোঝানো ভাষা।

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

তাহলে আপনি কীভাবে জেএসে প্রকৃত গোপনীয়তা পাবেন? সার্ভার সাইডে প্রাইভেট হওয়ার জন্য প্রয়োজনীয় সমস্ত কিছু রাখুন এবং এজেএক্স কলগুলি করতে জেএস ব্যবহার করুন।


এটি একটি গুরুতর সমস্যা যা আরও সুপরিচিত হওয়া উচিত। এই আক্রমণ বিরুদ্ধে একটি 'প্রতিরক্ষা' আছে?
জেমস

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

যদি কোনও ব্যবহারকারী গোপন পাসওয়ার্ড প্রবেশ করে তবে তিনি এই সার্ভার-সাইডটি করতে পারবেন না। এক পর্যায়ে পাসওয়ার্ডটি একটি 'প্রাইভেট' ভারে থাকবে। তাহলে কি কোনও আক্রমণকারী এটি পড়তে পারে? আমি আমার কোডকে বিশ্বাস করি এবং যাইহোক আমার বাড়ির মানগুলি বিবর্তনের অনুমতি দেয় না ()। আক্রমণকারী কিছু দূষিত তৃতীয় পক্ষের জাভাস্ক্রিপ্ট প্লাগ-ইন বা লাইব্রেরি হতে পারে যা আমি সঠিকভাবে যাচাই করিনি - সুতরাং, হ্যাঁ আমাকে এগুলি পরীক্ষা করা দরকার। আক্রমণকারীও পাশের কোনও বিজ্ঞাপনের মতো কিছু হতে পারে যা আমার কোডের সাথে ইন্টারঅ্যাক্ট করা উচিত নয়। আমি আমার সমস্ত কোড একটি বেনামে আবদ্ধ করে এর বিরুদ্ধে সুরক্ষা দিচ্ছি (function () {allMyStuff}());যাতে কোনও বৈশ্বিক কিছুই প্রকাশ না হয়।
জেমস

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

আমি বিশ্বাস করি সিউডোর্যান্ডম কোড অবলম্বন এই আক্রমণটির বিরুদ্ধে দুর্বল প্রতিরক্ষা হতে পারে - যখন আপনি একটি নির্দিষ্ট নামযুক্ত ফাংশনের উপর নির্ভর করতে পারবেন না তখন ফাংশন বডিটি সংশোধন করা আরও বেশি কঠিন; f.eval('nameOfVariable')যখন আপনি জানেন না তখন কী করা আরও কঠিন 'nameOfVariable'...
গেরশম


2

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

function MyObject(arg1, arg2, ...) {
  //constructor code using constructor arguments...
  //create/access public variables as 
  // this.var1 = foo;

  //private variables

  var v1;
  var v2;

  //private functions
  function privateOne() {
  }

  function privateTwon() {
  }

  //public functions

  MyObject.prototype.publicOne = function () {
  };

  MyObject.prototype.publicTwo = function () {
  };
}

কেউ আমাকে বলতে পারেন কেন এটি কেন ভোট পড়েছে? আমার কাছে ভালই মনে হচ্ছে.
থোমাসরুটটার

10
প্রতিবার আপনি যখন একটি করেন new MyObject, এর প্রোটোটাইপ MyObjectএকই মানগুলির সাথে প্রতিস্থাপিত হয়।
বিপিয়ারে

2
-1। কখনও কখনও .prototypeকনস্ট্রাক্টরের অভ্যন্তরে বরাদ্দ করবেন না ।
বার্গি

2
var TestClass = function( ) {

    var privateProperty = 42;

    function privateMethod( ) {
        alert( "privateMethod, " + privateProperty );
    }

    this.public = {
        constructor: TestClass,

        publicProperty: 88,
        publicMethod: function( ) {
            alert( "publicMethod" );
            privateMethod( );
        }
    };
};
TestClass.prototype = new TestClass( ).public;


var myTestClass = new TestClass( );

alert( myTestClass.publicProperty );
myTestClass.publicMethod( );

alert( myTestClass.privateMethod || "no privateMethod" );

জর্জেব্রকের মতো তবে কিছুটা কম ভার্বোস (আইএমএইচও) এইভাবে এটি করার ক্ষেত্রে কোনও সমস্যা? (আমি এটি কোথাও দেখিনি)

সম্পাদনা: আমি বুঝতে পেরেছি যে এটি নিখুঁতভাবে অকেজো, যেহেতু প্রতিটি স্বতন্ত্র ইনস্ট্যান্টিশনে পাবলিক পদ্ধতির নিজস্ব কপি থাকে, সুতরাং প্রোটোটাইপের ব্যবহারকে ক্ষুন্ন করে।


2

জাভাস্ক্রিপ্টে ব্যক্তিগত / পাবলিক পদ্ধতি / সদস্য এবং ইনস্ট্যান্টেশন সম্পর্কিত আমি এ পর্যন্ত সবচেয়ে বেশি উপভোগ করেছি:

নিবন্ধটি এখানে: http://www.sefol.com/?p=1090

এবং এখানে উদাহরণ:

var Person = (function () {

    //Immediately returns an anonymous function which builds our modules 
    return function (name, location) {

        alert("createPerson called with " + name);

        var localPrivateVar = name;

        var localPublicVar = "A public variable";

        var localPublicFunction = function () {
            alert("PUBLIC Func called, private var is :" + localPrivateVar)
        };

        var localPrivateFunction = function () {
            alert("PRIVATE Func called ")
        };

        var setName = function (name) {

            localPrivateVar = name;

        }

        return {

            publicVar: localPublicVar,

            location: location,

            publicFunction: localPublicFunction,

            setName: setName

        }

    }
})();


//Request a Person instance - should print "createPerson called with ben"
var x = Person("ben", "germany");

//Request a Person instance - should print "createPerson called with candide"
var y = Person("candide", "belgium");

//Prints "ben"
x.publicFunction();

//Prints "candide"
y.publicFunction();

//Now call a public function which sets the value of a private variable in the x instance
x.setName("Ben 2");

//Shouldn't have changed this : prints "candide"
y.publicFunction();

//Should have changed this : prints "Ben 2"
x.publicFunction();

জেএসফিডাল: http://jsfiddle.net/northkildonan/kopj3dt3/1/


এই পদ্ধতির একটি গুরুত্বপূর্ণ কনসার্ন রয়েছে - যদি আপনি 2 টি অবজেক্ট তৈরি করেছেন, মেমোরিতে 2 টি একই মেথড থাকবে (যেমন পাবলিক ফাংশন) 1000 বস্তু আপনার সমস্ত স্মৃতি খাবে eat
আর্টেমি জি

2

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

এটিই আমি নিয়ে এসেছি:

var MyClass = (function () {
    var secret = {}; // You can only getPriv() if you know this
    function MyClass() {
        var that = this, priv = {
            foo: 0 // ... and other private values
        };
        that.getPriv = function (proof) {
            return (proof === secret) && priv;
        };
    }
    MyClass.prototype.inc = function () {
        var priv = this.getPriv(secret);
        priv.foo += 1;
        return priv.foo;
    };
    return MyClass;
}());
var x = new MyClass();
x.inc(); // 1
x.inc(); // 2

অবজেক্টটিতে privব্যক্তিগত সম্পত্তি রয়েছে। এটি সর্বজনীন অনুষ্ঠানের মাধ্যমে অ্যাক্সেসযোগ্য getPriv(), falseতবে আপনি যদি এটিটি পাস না করেন তবে এই ফাংশনটি ফিরে আসে secretএবং এটি কেবল প্রধান বন্ধের মধ্যেই জানা যায়।


এটি সুরক্ষিত সদস্যদের অনুকরণ করে, এর থেকে উত্তরাধিকার সূত্রে প্রাপ্ত প্রকারগুলি সুরক্ষিত সদস্যদেরও অ্যাক্সেস করতে পারে। আমি ব্যক্তিগত হিসাবেও এই প্যাটার্নটির পক্ষে আছি
এইচএমআর

2

এই সম্পর্কে কি?

var Restaurant = (function() {

 var _id = 0;
 var privateVars = [];

 function Restaurant(name) {
     this.id = ++_id;
     this.name = name;
     privateVars[this.id] = {
         cooked: []
     };
 }

 Restaurant.prototype.cook = function (food) {
     privateVars[this.id].cooked.push(food);
 }

 return Restaurant;

})();

ব্যক্তিগত তাত্ক্ষণিক তাত্ক্ষণিক কাজ তাত্ক্ষণিক ফাংশনের সুযোগের বাইরে অসম্ভব। ফাংশনগুলির কোনও সদৃশ নেই, মেমরি সঞ্চয় করে।

খারাপ দিকটি হ'ল ব্যক্তিগত ভেরিয়েবলগুলির অনুসন্ধান privateVars[this.id].cookedটাইপ করা হাস্যকর। একটি অতিরিক্ত "আইডি" পরিবর্তনশীলও রয়েছে।


এই ছাড়বে Restaurantযেমন undefinedকারণ আপনার বেনামী ফাংশন থেকে কিছু ফেরত না।
ব্যবহারকারী 4815162342

কোথায় এবং কিভাবে? ধরে নেওয়া হয়েছে যে তৈরি রেস্তোঁরাটির রেফারেন্স হারিয়ে গেছে, প্রাইভেটওয়ারগুলির মালিকের কাছে কোনও রেফারেন্স থাকবে না। রেফারেন্স গ্রাফ অ্যাসাইক্লিক। আমি কী মিস করছি?
ইভান লেইস

প্রকৃতপক্ষে এটিই একমাত্র উত্তর যা পদ্ধতির পাশাপাশি ব্যক্তিগত সম্পত্তিগুলিকে সমর্থন করে। দুটি মাত্র ইস্যু উত্তরে ইতিমধ্যে উল্লেখ করা হয়েছে।
pishpish

আমি একটি স্মৃতি ফাঁস দেখছি: যখন কোনও উদাহরণ Restaurantআবর্জনা-সংগ্রহ করা হয়েছে তখন এর মানগুলি এর মধ্যেই থেকে যায় privateVars। এ ক্ষেত্রে WeakMapএটির জন্য ভাল প্রতিস্থাপন হতে পারে Array
গেরশম

2

অজ্ঞাতনামা ফাংশনে সমস্ত কোড মোড়ানো: তারপরে, সমস্ত ফাংশনগুলি ব্যক্তিগত হবে, কেবলমাত্র windowবস্তুর সাথে যুক্ত ফাংশন :

(function(w,nameSpacePrivate){
     w.Person=function(name){
         this.name=name;   
         return this;
     };

     w.Person.prototype.profilePublic=function(){
          return nameSpacePrivate.profile.call(this);
     };  

     nameSpacePrivate.profile=function(){
       return 'My name is '+this.name;
     };

})(window,{});

এটা ব্যবহার কর :

  var abdennour=new Person('Abdennour');
  abdennour.profilePublic();

বেহালা


1

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

const data = new WeakMap();

function Foo(value) {
    data.set(this, {value});
}

// public method accessing private value
Foo.prototype.accessValue = function() {
    return data.get(this).value;
}

// private 'method' accessing private value
function accessValue(foo) {
    return data.get(foo).value;
}

export {Foo};

0

ব্যক্তিগত ফাংশনগুলি মডিউল প্যাটার্ন ব্যবহার করে পাবলিক ভেরিয়েবল অ্যাক্সেস করতে পারে না


0

যেহেতু প্রত্যেকে এখানে নিজের কোড পোস্ট করছে, তাই আমিও এটি করবো ...

আমি ক্রকফোর্ডকে পছন্দ করি কারণ তিনি জাভাস্ক্রিপ্টে সত্যিকারের বস্তু ভিত্তিক নিদর্শনগুলি প্রবর্তন করেছিলেন। তবে তিনি একটি নতুন ভুল বোঝাবুঝি নিয়ে এসেছিলেন, "সেই" একটি।

তাহলে তিনি কেন "যে = এটি" ব্যবহার করছেন? এটির সাথে ব্যক্তিগত ফাংশনগুলির কোনও যোগসূত্র নেই। এটি অভ্যন্তরীণ ফাংশন সঙ্গে করতে হবে!

কারণ ক্রকফোর্ডের মতে এটি বাগি কোড:

Function Foo( ) {
    this.bar = 0; 
    var foobar=function( ) {
        alert(this.bar);
    }
} 

সুতরাং তিনি এটি করার পরামর্শ দিলেন:

Function Foo( ) {
    this.bar = 0;
    that = this; 
    var foobar=function( ) {
        alert(that.bar);
    }
}

সুতরাং আমি যেমন বলেছিলাম, আমি নিশ্চিত যে ক্রোকফোর্ড তার এবং এই সম্পর্কে তাঁর ব্যাখ্যাটি ভুল করেছিলেন (তবে তার কোড অবশ্যই সঠিক)। বা তিনি কেবল জাভাস্ক্রিপ্ট বিশ্বকে বোকা বানাচ্ছেন, তার কোডটি অনুলিপি করছেন তা জানতে? আমি জানি ... আমি কোনও ব্রাউজার নেই; ডি

সম্পাদনা

আহ, এটাই সব: এগুলিই 'ভার ওই = এই'; জাভাস্ক্রিপ্ট মানে?

সুতরাং ক্রোকি তার ব্যাখ্যায় সত্যিই ভুল ছিল .... তবে ঠিক তার কোড সহ, সুতরাং তিনি এখনও দুর্দান্ত লোক। :))


0

সাধারণভাবে আমি বস্তুটিতে সাময়িকভাবে ব্যক্তিগত অবজেক্ট _ যুক্ত করেছি added পদ্ধতির জন্য আপনাকে "পাওয়ার-কন্সট্রাক্টর" এর সাথে গোপনীয়তাটি এক্সপ্লিটলিপি খুলতে হবে। আপনি যদি প্রোটোটাইপ থেকে পদ্ধতিটি কল করেন তবে আপনি প্রোটোটাইপ-পদ্ধতিটি ওভাররাইট করতে সক্ষম হবেন

  • "পাওয়ার-কনস্ট্রাক্টর" এ একটি সর্বজনীন পদ্ধতি অ্যাক্সেসযোগ্য করুন: (সিটিএক্স অবজেক্ট প্রসঙ্গ)

    ctx.test = GD.Fabric.open('test', GD.Test.prototype, ctx, _); // is a private object
  • এখন আমার এই উন্মুক্ত গোপনীয়তা রয়েছে:

    GD.Fabric.openPrivacy = function(func, clss, ctx, _) {
        return function() {
            ctx._ = _;
            var res = clss[func].apply(ctx, arguments);
            ctx._ = null;
            return res;
        };
    };

0

এই আমি কাজ করেছিলাম:

এক শ্রেণীর চিনি কোডের দরকার যা আপনি এখানে খুঁজে পেতে পারেন । সুরক্ষিত, উত্তরাধিকার, ভার্চুয়াল, স্ট্যাটিক স্টাফ সমর্থন করে ...

;( function class_Restaurant( namespace )
{
    'use strict';

    if( namespace[ "Restaurant" ] ) return    // protect against double inclusions

        namespace.Restaurant = Restaurant
    var Static               = TidBits.OoJs.setupClass( namespace, "Restaurant" )


    // constructor
    //
    function Restaurant()
    {
        this.toilets = 3

        this.Private( private_stuff )

        return this.Public( buy_food, use_restroom )
    }

    function private_stuff(){ console.log( "There are", this.toilets, "toilets available") }

    function buy_food     (){ return "food"        }
    function use_restroom (){ this.private_stuff() }

})( window )


var chinese = new Restaurant

console.log( chinese.buy_food()      );  // output: food
console.log( chinese.use_restroom()  );  // output: There are 3 toilets available
console.log( chinese.toilets         );  // output: undefined
console.log( chinese.private_stuff() );  // output: undefined

// and throws: TypeError: Object #<Restaurant> has no method 'private_stuff'

0
Class({  
    Namespace:ABC,  
    Name:"ClassL2",  
    Bases:[ABC.ClassTop],  
    Private:{  
        m_var:2  
    },  
    Protected:{  
        proval:2,  
        fight:Property(function(){  
            this.m_var--;  
            console.log("ClassL2::fight (m_var)" +this.m_var);  
        },[Property.Type.Virtual])  
    },  
    Public:{  
        Fight:function(){  
            console.log("ClassL2::Fight (m_var)"+this.m_var);  
            this.fight();  
        }  
    }  
});  

https://github.com/nooning/JSClass


0

প্রোটোটাইপ https://github.com/TremayneChrist/ProtectJS এ আপনাকে সত্যিকারের ব্যক্তিগত পদ্ধতি থাকতে দেওয়ার জন্য আমি একটি নতুন সরঞ্জাম তৈরি করেছি

উদাহরণ:

var MyObject = (function () {

  // Create the object
  function MyObject() {}

  // Add methods to the prototype
  MyObject.prototype = {

    // This is our public method
    public: function () {
      console.log('PUBLIC method has been called');
    },

    // This is our private method, using (_)
    _private: function () {
      console.log('PRIVATE method has been called');
    }
  }

  return protect(MyObject);

})();

// Create an instance of the object
var mo = new MyObject();

// Call its methods
mo.public(); // Pass
mo._private(); // Fail

1
দয়া করে কীভাবে এটি কাজ করে তা ব্যাখ্যা করতে পারেন? কীভাবে / কোথায় আপনি পদ্ধতিটি কল করতে পারেন_private ?
বার্গি

0

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

var Restaurant = (function(){
    var private_buy_food = function(that){
        that.data.soldFood = true;
    }
    var private_take_a_shit = function(){
        this.data.isdirty = true;   
    }
    // New Closure
    function restaurant()
    {
        this.data = {
            isdirty : false,
            soldFood: false,
        };
    }

    restaurant.prototype.buy_food = function()
    {
       private_buy_food(this);
    }
    restaurant.prototype.use_restroom = function()
    {
       private_take_a_shit.call(this);
    }
    return restaurant;
})()

// TEST:

var McDonalds = new Restaurant();
McDonalds.buy_food();
McDonalds.use_restroom();
console.log(McDonalds);
console.log(McDonalds.__proto__);

আসলে, এটি কাজ করে না। প্রত্যেকের new Restaurantনিজস্ব নিজস্ব restaurantপ্রতিযোগী রয়েছে এবং "প্রোটোটাইপ" সম্পূর্ণরূপে আপত্তিজনক নয়।
বার্গি

@Bergi। আসলে, আপনি ঠিক বলেছেন। এটি কাজ করবে তবে একটি রিসোর্স হগও হবে (এটিকে কি বলা হয়?)। আমি এই বিষয়ে আমার উত্তর সম্পাদনা করেছি।
ফ্লেক্স ইলেকট্রো ডিমিলিং

আপডেটের জন্য ধন্যবাদ. পূর্ববর্তী সংস্করণটি কী বলবেন তা ধারণা নেই (তবে "বাগ" :-)
বার্গি

0

আমি জানি কিছুটা দেরি হয়ে গেছে তবে এ কেমন?

var obj = function(){
    var pr = "private";
    var prt = Object.getPrototypeOf(this);
    if(!prt.hasOwnProperty("showPrivate")){
        prt.showPrivate = function(){
            console.log(pr);
        }
    }    
}

var i = new obj();
i.showPrivate();
console.log(i.hasOwnProperty("pr"));

0

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

function calledPrivate(){
    var stack = new Error().stack.toString().split("\n");
    function getClass(line){
        var i = line.indexOf(" ");
        var i2 = line.indexOf(".");
        return line.substring(i,i2);
    }
    return getClass(stack[2])==getClass(stack[3]);
}

class Obj{
    privateMethode(){
        if(calledPrivate()){
            console.log("your code goes here");
        }
    }
    publicMethode(){
        this.privateMethode();
    }
}

var obj = new Obj();
obj.publicMethode(); //logs "your code goes here"
obj.privateMethode(); //does nothing

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


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

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

সাহায্য করার জন্য ধন্যবাদ! আমি কিছু ভুল বুঝেছি কিনা তা নিশ্চিত ছিলাম না। তবে হ্যাঁ, আমরা সবাই বাঁচি এবং শিখি!
জেএইচ এইচ

0

ব্যক্তিগত এবং পাবলিক ইন্টারফেস এবং রচনার জন্য সহায়তার সাথে এ ক্লিন ও সাধারণ 'ক্লাস' সমাধানের জন্য এই উত্তরটি দেখুন

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