গেটস-ডমিগুলির জন্য সেটটার


133

আমি চেষ্টা করছিলাম আমার মাথাটি গেটার এবং সেটটারের আশেপাশে নেওয়ার এবং এটি ডুবে না not আমি পড়েছি জাভাস্ক্রিপ্ট Getters এবং Setters এবং সংজ্ঞা Getters এবং Setters এবং মাত্র তাই না পেয়ে।

কেউ কি পরিষ্কারভাবে বলতে পারেন:

  1. একজন গেটর এবং সেটার বলতে কী বোঝায় এবং
  2. কিছু খুব সহজ উদাহরণ দিন?

12
ব্যক্তিগতভাবে, আমি জানি না আপনি কীভাবে জনের চেয়ে স্পষ্ট ব্যাখ্যা পেতে পারেন ...
জেসন বুটিং

OO যেমন পণ্য বিশ্ব, গেটার এবং সেটার সাহায্যে লেখার একটি বর্গ সঠিকভাবে encapsulated হয়
overexchange

মূলত আমি এটি এর মতো দেখতে পাচ্ছি: আপনি সম্পত্তি পাওয়ার ও সেট করার জন্য ওভারলোডগুলি সংজ্ঞায়িত করছেন এবং এই ওভারলোডগুলি হ'ল ফাংশন; কিন্তু, আপনি তাদের কল করতে হবে না। এইভাবে আপনি এর a = setValue(5);সাথে প্রতিস্থাপন করতে পারেন a = 5;এবং এর setValue()মাধ্যমে আপনার পছন্দমতো যা করতে হুডের নীচে ডাকা হবে।
অ্যান্ড্রু

উত্তর:


102

@ মিলিমুজ এর উত্তর ছাড়াও, সেটটারগুলি অন্যান্য মানগুলি আপডেট করার জন্যও ব্যবহার করা যেতে পারে।

function Name(first, last) {
    this.first = first;
    this.last = last;
}

Name.prototype = {
    get fullName() {
        return this.first + " " + this.last;
    },

    set fullName(name) {
        var names = name.split(" ");
        this.first = names[0];
        this.last = names[1];
    }
};

এখন, আপনি সেট করতে পারেন fullName, এবং firstএবং lastআপডেট এবং ভাইস করা হবে বিপরীতভাবে।

n = new Name('Claude', 'Monet')
n.first # "Claude"
n.last # "Monet"
n.fullName # "Claude Monet"
n.fullName = "Gustav Klimt"
n.first # "Gustav"
n.last # "Klimt"

2
@ আকাশ: না, যদিও ইন্টারনেট এক্সপ্লোরার 9 নতুন Object.definePropertyফাংশনকে সমর্থন করে যা গেটর এবং সেটটারদের সংজ্ঞায়িত করতে পারে।
ম্যাথু ক্রামলে

9
সত্যিই কি বেদনাদায়ক নয় যে এমএস জেএসকে সঠিকভাবে সমর্থন করে না এবং তারা সর্বত্র তাদের রৌপ্য আলো চালাচ্ছে না, তাই আমাকে দুটি বার প্রোগ্রাম করতে হবে, একটি এসএল এবং একটি বিশ্বজুড়ে :)
আকাশ কাভা

2
@ মার্টিন: আপনি জনের উত্তরের মতো একই কৌশলটি ব্যবহার করে তাদের ব্যক্তিগত করতে পারেন । আপনি যদি সত্যিকারের গেটার / সেটার ব্যবহার করতে চান তবে আপনাকে this.__defineGetter__বা নতুন Object.definePropertyফাংশনটি ব্যবহার করতে হবে ।
ম্যাথু ক্রামলে

1
উপরে তালিকাভুক্ত পদ্ধতির সাথে কেবল একটি সমস্যা, আপনি যদি ইতিমধ্যে বিদ্যমান শ্রেণীর জন্য গেটার এবং সেটটার যুক্ত করতে চান তবে এটি প্রোটোটাইপগুলিকে ওভাররাইড করবে এবং মূল পদ্ধতিগুলি অ্যাক্সেসযোগ্য হবে না।
xchg.ca

1
এই পদ্ধতির ওভাররাইট হয় না Name.prototype.constructor? মিলিমুজ এর উত্তরের একটি খারাপ বিকল্প বলে মনে হচ্ছে ।
r0estir0bbe

62

জাভাস্ক্রিপ্টে গেটারস এবং সিটারস

সংক্ষিপ্ত বিবরণ

জাভাস্ক্রিপ্টে getters এবং সেটটার গণিত বৈশিষ্ট্য বা অ্যাক্সেসর সংজ্ঞায়িত করতে ব্যবহৃত হয় । একটি গুণিত সম্পত্তি হ'ল যা কোনও বস্তুর মান পেতে বা সেট করতে কোনও ফাংশন ব্যবহার করে। বেসিক থিওরি এমন কিছু করছে:

var user = { /* ... object with getters and setters ... */ };
user.phone = '+1 (123) 456-7890'; // updates a database
console.log( user.areaCode ); // displays '123'
console.log( user.area ); // displays 'Anytown, USA'

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

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

কীওয়ার্ডগুলি সেট / সেট করুন

ECMAScript 5 গণিত বৈশিষ্ট্য সংজ্ঞায়িত করার জন্য সমর্থন getএবং setকীওয়ার্ডগুলি। তারা IE 8 এবং নীচে বাদে সমস্ত আধুনিক ব্রাউজারের সাথে কাজ করে।

var foo = {
    bar : 123,
    get bar(){ return bar; },
    set bar( value ){ this.bar = value; }
};
foo.bar = 456;
var gaz = foo.bar;

কাস্টম গেটারস এবং সিটারস

getএবং setসংরক্ষিত শব্দ নয়, যাতে আপনার নিজস্ব কাস্টম, ক্রস ব্রাউজারের গণিত সম্পত্তি ফাংশন তৈরি করতে সেগুলি ওভারলোড করা যায়। এটি যে কোনও ব্রাউজারে কাজ করবে।

var foo = {
    _bar : 123,
    get : function( name ){ return this[ '_' + name ]; },
    set : function( name, value ){ this[ '_' + name ] = value; }
};
foo.set( 'bar', 456 );
var gaz = foo.get( 'bar' );

বা আরও কমপ্যাক্ট পদ্ধতির জন্য, একটি একক ফাংশন ব্যবহার করা যেতে পারে।

var foo = {
    _bar : 123,
    value : function( name /*, value */ ){
        if( arguments.length < 2 ){ return this[ '_' + name ]; }
        this[ '_' + name ] = value;
    }
};
foo.value( 'bar', 456 );
var gaz = foo.value( 'bar' );

এরকম কিছু করা থেকে বিরত থাকুন যা কোড ব্লাট হতে পারে।

var foo = {
    _a : 123, _b : 456, _c : 789,
    getA : function(){ return this._a; },
    getB : ..., getC : ..., setA : ..., setB : ..., setC : ...
};

উপরোক্ত উদাহরণগুলির জন্য, ব্যবহারকারীদের কেবল foo.barবনাম করা থেকে বিরত রাখতে foo.get( 'bar' )এবং "কুক্কযুক্ত" মান পাওয়ার জন্য অভ্যন্তরীণ সম্পত্তির নামগুলি আন্ডারস্কোর দিয়ে বিমূর্ত করা হয়। সম্পত্তিটি অ্যাক্সেস করা হচ্ছে তার নামের উপর নির্ভর করে আপনি বিভিন্ন কাজ করতে শর্তযুক্ত কোড ব্যবহার করতে পারেন (এর মাধ্যমেname প্যারামিটারের ) ।

Object.defineProperty ()

ব্যবহারকারী Object.defineProperty()এবং সেটটার যুক্ত করার অন্য উপায়, এবং সেগুলি সংজ্ঞায়িত হওয়ার পরে অবজেক্টগুলিতে ব্যবহার করা যেতে পারে। এটি কনফিগারযোগ্য এবং গণ্যমান্য আচরণ সেট করতেও ব্যবহার করা যেতে পারে। এই সিনট্যাক্সটি আইই 8 এর সাথেও কাজ করে তবে দুর্ভাগ্যক্রমে কেবল ডোম অবজেক্টে।

var foo = { _bar : 123 };
Object.defineProperty( foo, 'bar', {
    get : function(){ return this._bar; },
    set : function( value ){ this._bar = value; }
} );
foo.bar = 456;
var gaz = foo.bar;

__defineGetter __ ()

অবশেষে, __defineGetter__()অন্য একটি বিকল্প। এটি অবহেলিত, তবে এখনও ওয়েবের চারপাশে ব্যাপকভাবে ব্যবহৃত হয়েছে এবং শীঘ্রই যে কোনও সময় অদৃশ্য হওয়ার সম্ভাবনা নেই। এটি আইই 10 এবং নীচে বাদে সমস্ত ব্রাউজারে কাজ করে। যদিও অন্যান্য বিকল্পগুলি নন-আইইতেও ভাল কাজ করে, সুতরাং এটি এতো কার্যকর নয়।

var foo = { _bar : 123; }
foo.__defineGetter__( 'bar', function(){ return this._bar; } );
foo.__defineSetter__( 'bar', function( value ){ this._bar = value; } );

আরও লক্ষণীয় যে পরের উদাহরণগুলিতে পুনরাবৃত্তি এড়াতে প্রবেশকারীর নামের চেয়ে অভ্যন্তরীণ নামগুলি অবশ্যই আলাদা হওয়া উচিত (যেমন, foo.barকলিং foo.get(bar)কলিং foo.barকলিংfoo.get(bar) ...) ।

আরো দেখুন

MDN পান , সেট করুন , অবজেক্ট.ডিফাইনপ্রোপার্টি () , __DinefineGetter __ () , __defineSetter __ ()
MSDN IE8 গেটর সাপোর্ট


1
ইন আরো কম্প্যাক্ট পদ্ধতির , this[ '_' + name ] = value;হতে পারে this[ '_' + name ] = arguments[1];এবং নির্দিষ্ট করার কোন প্রয়োজন নেই হবে valueARG।
31:38

1
উদাহরণ: var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456; একটি ব্যতিক্রম উত্থাপন: আনকচড রেঞ্জেররর: অবজেক্ট.সেট বারে [বার হিসাবে] (<নামবিহীন>: 4: 32) অবজেক্ট.সেট বারে [বার হিসাবে] (<নামবিহীন>: 4: 32 ) অবজেক্ট.সেট বারে [বার হিসাবে] (<অজ্ঞাতনামা: 4: 32) অবজেক্ট.সেট বারে [বার হিসাবে] (<নামবিহীন>: 4: 32) অবজেক্ট.সেট বারে [বার হিসাবে] (<নামবিহীন> : 4: 32) অবজেক্ট.সেট বারে [বার হিসাবে] (<নামবিহীন>: 4: 32)
নেভএফ

1
সেট / গেটের নাম অবশ্যই প্রোপার্টি নামের থেকে আলাদা হতে হবে। সুতরাং bar: 123এবং this.bar = valueইত্যাদির পরিবর্তে _bar উদাহরণস্বরূপ এগুলিকে পরিবর্তন করুন । দেখুন: hongkiat.com/blog/getters-setters- জাভাস্ক্রিপ্ট
nevf

@ নিউভ সংশোধনের জন্য ধন্যবাদ! হ্যাঁ, সাধারণত গণিত বৈশিষ্ট্যগুলির সাথে "আসল" অভ্যন্তরীণটির নাম দেওয়া হয় _fooবা এর মতো mFoo। যদি এটি গেটার / সেটারের মতো হয় তবে এটি পুনরাবৃত্তির কারণে অসীম লুপ এবং তারপরে স্ট্যাক ওভারফ্লো ™ ;-) সৃষ্টি করবে কারণ আপনি যখন a = b বলবেন, তখন এটি a.get (b) কল করে যা নিজেই a = b কে ডাকে , যা a.get (খ), ...
বেজোর

58

আপনি এগুলিকে উদাহরণস্বরূপ গণিত বৈশিষ্ট্যগুলি প্রয়োগ করতে ব্যবহার করবেন।

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

function Circle(radius) {
    this.radius = radius;
}

Object.defineProperty(Circle.prototype, 'circumference', {
    get: function() { return 2*Math.PI*this.radius; }
});

Object.defineProperty(Circle.prototype, 'area', {
    get: function() { return Math.PI*this.radius*this.radius; }
});

c = new Circle(10);
console.log(c.area); // Should output 314.159
console.log(c.circumference); // Should output 62.832

(CodePen)


ঠিক আছে, আমি মনে করি আমি এটি পেতে শুরু করছি। আমি একটি অ্যারে অবজেক্টের দৈর্ঘ্যের সম্পত্তিটিতে একজন গেটারকে বরাদ্দ করার চেষ্টা করছি তবে একটি ত্রুটি পেয়েছি: "ভার দৈর্ঘ্যের পুনঃনির্মাণ" এবং কোডটি এর মতো দেখাচ্ছে: আপত্তি = []; আপত্তি .__ DefineGetter __ ('দৈর্ঘ্য', ফাংশন () {retre this.leth;;);

1
এর কারণ অ্যারে অবজেক্টগুলির একটি বিল্টিন দৈর্ঘ্যের সম্পত্তি রয়েছে। যদি পুনঃসংশোধনের অনুমতি দেওয়া হয় তবে নতুন দৈর্ঘ্যে কল করা অসীম পুনরাবৃত্তি হবে। সম্পত্তিটিকে "আমার_ দৈর্ঘ্য" বা এই জাতীয় কিছু বলার চেষ্টা করুন।
মিলিমুজ

উভয় প্রাপ্তকারীকে একটি বিবৃতিতে সংজ্ঞায়িত করতে, ব্যবহার করুন Object.defineProperties
r0estir0bbe

আপনি কি কেবলমাত্র "অঞ্চল" তৈরি করতে পারবেন না: ফাংশন () {রিটার্ন ...}}? কেবল এটি কোনও বস্তুর সম্পত্তি হিসাবে বরাদ্দ করুন
রেগারবয়

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

16

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

গেটার:

var settings = {
    firstname: 'John',
    lastname: 'Smith',
    get fullname() { return this.firstname + ' ' + this.lastname; }
};

console.log(settings.fullname);

... লগ ইন করুন করবে John Smithঅবশ্যই। একজন গিটারটি একটি ভেরিয়েবল অবজেক্টের বৈশিষ্ট্যের মতো আচরণ করে, তবে ফ্লাইতে তার ফেরত মান গণনা করার জন্য কোনও ফাংশনের নমনীয়তা সরবরাহ করে। কল করার সময় এটি কোনও প্রয়োজন হয় না এমন ফাংশন তৈরির মূলত অভিনব উপায়।

সেটার:

var address = {
    set raw(what) {
        var loc = what.split(/\s*;\s*/),
        area = loc[1].split(/,?\s+(\w{2})\s+(?=\d{5})/);

        this.street = loc[0];
        this.city = area[0];
        this.state = area[1];
        this.zip = area[2];
    }
};

address.raw = '123 Lexington Ave; New York NY  10001';
console.log(address.city);

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

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


আমি এখনও getMethod বা setMethod তৈরির তুলনায় get and set ব্যবহারের সুবিধাটি বুঝতে পারি না। আপনি () ছাড়াই এটি কল করতে পারেন যে একমাত্র সুবিধা? এটি জাভাস্ক্রিপ্টে যুক্ত হওয়ার আরও একটি কারণ থাকতে হবে।
Andreas

@ আন্দ্রেয়াস গেটার্স এবং সেটটাররা যখন ডাকা হয় তখন বৈশিষ্ট্যের মতো আচরণ করে, যা তাদের উদ্দেশ্য স্থির করতে সহায়তা করতে পারে। তারা অন্যথায় অনুপস্থিত দক্ষতাগুলি আনলক করে না তবে তাদের ব্যবহার আপনাকে আপনার চিন্তাভাবনাগুলি সংগঠিত করতে সহায়তা করতে পারে। এটাই আসল উপকার। ব্যবহারিক উদাহরণ হিসাবে, আমি একটি গুগল ম্যাপস অবজেক্টটি প্রসারিত করার জন্য একটি গেটর ব্যবহার করতাম। আমার ক্যামেরা রোল এঙ্গেল গণনা করা দরকার যাতে আমি ম্যাপের টাইলগুলি দিগন্তের দিকে ফ্ল্যাট ঘোরতে পারি। গুগল এখন এর পিছনে স্বয়ংক্রিয়ভাবে এটি করে; তবে সেই সময়টি রিটার্ন ভালের maps.rollচেয়ে সম্পত্তি হিসাবে পুনরুদ্ধার করা আমার পক্ষে সহায়ক ছিল maps.roll()। এটি কেবল একটি অগ্রাধিকার।
রোজ

সুতরাং কোডটি () ছাড়াই ক্লিনার দেখানোর জন্য এটি কেবল সিনট্যাকটিক চিনি। আপনি কেন উদাহরণটি দেখতে পারেন না তা আমি দেখতে পাচ্ছি নাmaps.roll()
Andreas

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

:) একটি জিনিস যা আমি দেখতে পাই যে সিনট্যাক্সটি পেতে এবং সেট করে তা হ'ল স্বয়ংক্রিয়ভাবে চালিত হচ্ছে যদি এটি কোনও সম্পত্তির সম্পত্তি হিসাবে ব্যবহৃত হয়।
Andreas

11

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

var counter = function() {
    var count = 0;

    this.inc = function() {
        count++;
    };

    this.getCount = function() {
        return count;
    };
};

var i = new Counter();
i.inc();
i.inc();
// writes "2" to the document
document.write( i.getCount());

আপনি যদি এখনও বিভ্রান্ত থাকেন তবে জাভাস্ক্রিপ্টে ব্যক্তিগত সদস্যদের নিয়ে ক্রকফোর্ডের নিবন্ধটি একবার দেখুন ।


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

নিশ্চিত না যে আমি তাকে শক্তিশালী বলব কিনা। এক্স হিসাবে উপস্থিত কিছু কিন্তু সত্যই ওয়াই হ'ল প্রয়োজনীয় স্পষ্ট নয়। আমি এর var baz = foo.barপিছনে গোপন আচরণের পুরো উত্থিত সেটটি আশা করব না। আমি তবে তা আশা করব foo.getBar()
AgmLauncher

8

আমি মনে করি আপনি প্রথম নিবন্ধটি লিঙ্ক করেছেন এটি খুব পরিষ্কারভাবে বলেছেন:

এই পদ্ধতিতে জাভাস্ক্রিপ্ট লেখার সুস্পষ্ট সুবিধা হ'ল আপনি এটিকে অস্পষ্ট মানগুলি ব্যবহার করতে পারেন যা আপনি ব্যবহারকারীকে সরাসরি অ্যাক্সেস করতে চান না।

এখানে লক্ষ্যটি কেবল একটি get()বা set()পদ্ধতিতে অ্যাক্সেসের মাধ্যমে ক্ষেত্রগুলিকে আবদ্ধ এবং বিমূর্ত করা । এইভাবে, আপনি যেকোন উপায়ে অভ্যন্তরীণভাবে ক্ষেত্র / ডেটা সংরক্ষণ করতে পারেন তবে বাইরের উপাদানগুলি কেবল আপনার প্রকাশিত ইন্টারফেসের বাইরে। এটি আপনাকে বাহ্যিক ইন্টারফেসগুলি পরিবর্তন না করে অভ্যন্তরীণ পরিবর্তন করতে set(), পদ্ধতির মধ্যে কিছু বৈধতা বা ত্রুটি-চেক করার অনুমতি দেয় etc.


6

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

var employee = {
    first: "Boris",
    last: "Sergeev",
    get fullName() {
        return this.first + " " + this.last;
    },
    set fullName(value) {
        var parts = value.toString().split(" ");
        this.first = parts[0] || "";
        this.last = parts[1] || "";
    },
    email: "boris.sergeev@example.com"
};

চূড়ান্ত ফলাফল:

console.log(employee.fullName); //Boris Sergeev
employee.fullName = "Alex Makarenko";

console.log(employee.first);//Alex
console.log(employee.last);//Makarenko
console.log(employee.fullName);//Alex Makarenko

2

এ সম্পর্কে কী বিভ্রান্তিকর ... গিটাররা হ'ল ফাংশন যা আপনি যখন কোনও সম্পত্তি, সেটটারগুলি সেট করেন, তখন এটি বলা হয়। উদাহরণস্বরূপ, আপনি যদি

obj.prop = "abc";

আপনি সম্পত্তি প্রপ ঠিকঠাক করে দিচ্ছেন, যদি আপনি গেটার / সেটার ব্যবহার করেন তবে সেটার ফাংশনটি আর্গুমেন্ট হিসাবে "এবিসি" সহ কল ​​করা হবে। অবজেক্টের অভ্যন্তরে সেটার ফাংশন সংজ্ঞা আদর্শভাবে এর মতো দেখতে পাবেন:

set prop(var) {
   // do stuff with var...
}

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


2

আপনি কন্সট্রাক্টরের প্রোটোটাইপের মাধ্যমে জেএস ক্লাসের জন্য উদাহরণ পদ্ধতিটি সংজ্ঞায়িত করতে পারেন।

নমুনা কোডটি নিম্নলিখিত:

// BaseClass

var BaseClass = function(name) {
    // instance property
    this.name = name;
};

// instance method
BaseClass.prototype.getName = function() {
    return this.name;
};
BaseClass.prototype.setName = function(name) {
    return this.name = name;
};


// test - start
function test() {
    var b1 = new BaseClass("b1");
    var b2 = new BaseClass("b2");
    console.log(b1.getName());
    console.log(b2.getName());

    b1.setName("b1_new");
    console.log(b1.getName());
    console.log(b2.getName());
}

test();
// test - end

এবং, এটি যে কোনও ব্রাউজারের জন্য কাজ করা উচিত, আপনি এই কোডটি চালাতে কেবল নোডেজও ব্যবহার করতে পারেন।


1
এটি কেবলমাত্র নতুন getName এবং setName পদ্ধতি তৈরি করছে। এগুলি সম্পত্তি তৈরির সাথে সম্পর্কিত নয়!
uzay95

2

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

Object.defineProperty(Array.prototype, "last", {
    get: function() { return this[this.length - 1] }
});

আইএমএইচও ফাংশন যুক্ত করার চেয়ে কখনও কিছুটা সুন্দর।


1

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

function Foo(someValue) {
    this.getValue = function() { return someValue; }
    return this;
}

var myFoo = new Foo(5);
/* We can read someValue through getValue(), but there is no mechanism
 * to modify it -- hurrah, we have achieved encapsulation!
 */
myFoo.getValue();

যদি আপনি প্রকৃত জেএস গেটর / সেটার বৈশিষ্ট্যটি উল্লেখ করে থাকেন, যেমন। defineGetter/ defineSetter, বা { get Foo() { /* code */ } }, তারপরে এটি লক্ষণীয় যে বেশিরভাগ আধুনিক ইঞ্জিনগুলিতে পরবর্তী সময়ে properties বৈশিষ্ট্যগুলির ব্যবহার আরও ধীর হবে। যেমন। এর পারফরম্যান্স তুলনা করুন

var a = { getValue: function(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.getValue();

বনাম

var a = { get value(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.value;

-1

আপনাদের জন্য আমি একটি পেয়েছি যা কিছুটা কুৎসিত হতে পারে তবে এটি প্ল্যাটফর্মের মধ্যে দিয়ে যায়

function myFunc () {

var _myAttribute = "default";

this.myAttribute = function() {
    if (arguments.length > 0) _myAttribute = arguments[0];
    return _myAttribute;
}
}

এইভাবে, আপনি কল যখন

var test = new myFunc();
test.myAttribute(); //-> "default"
test.myAttribute("ok"); //-> "ok"
test.myAttribute(); //-> "ok"

আপনি যদি সত্যিই জিনিসগুলি মশলা করতে চান তবে আপনি একটি টাইপ চেক sertোকাতে পারেন:

if (arguments.length > 0 && typeof arguments[0] == "boolean") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "number") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "string") _myAttribute = arguments[0];

অথবা উন্নত টাইপফ চেক দিয়ে এমনকি ক্রেজিয়ারে যান : কোডিংফোরামস.কম এ টাইপ.ওফ () কোড


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