কীভাবে জাভাস্ক্রিপ্ট অবজেক্ট.ডাইনফাইনপ্রোপার্টি ব্যবহার করবেন


183

Object.definePropertyপদ্ধতিটি কীভাবে ব্যবহার করতে হয় সে জন্য আমি চারদিকে তাকালাম , তবে কোনও শালীন কিছুই পাইনি।

কেউ আমাকে কোডের এই স্নিপেট দিয়েছে :

Object.defineProperty(player, "health", {
    get: function () {
        return 10 + ( player.level * 15 );
    }
})

তবে আমি এটা বুঝতে পারি না। মূলত, getআমি যা পাই না তা হ'ল (পাং উদ্দেশ্যে)। এটা কিভাবে কাজ করে?


1
বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / …এটি এখানে একটি দুর্দান্ত টিউটোরিয়াল।
মার্টিয়ান2049

উত্তর:


498

যেহেতু আপনি অনুরূপ প্রশ্ন জিজ্ঞাসা করেছেন , আসুন এটি ধাপে ধাপে নেওয়া যাক। এটি কিছুটা দীর্ঘ, তবে আমি এটি লেখার জন্য যে সময় ব্যয় করেছি তার চেয়ে বেশি সময় আপনার সাশ্রয় হতে পারে:

সম্পত্তি ক্লায়েন্ট কোডের পৃথক পৃথককরণের জন্য ডিজাইন করা একটি ওওপি বৈশিষ্ট্য। উদাহরণস্বরূপ, কিছু ই-শপে আপনার কাছে এই জাতীয় জিনিস থাকতে পারে:

function Product(name,price) {
  this.name = name;
  this.price = price;
  this.discount = 0;
}

var sneakers = new Product("Sneakers",20); // {name:"Sneakers",price:20,discount:0}
var tshirt = new Product("T-shirt",10);  // {name:"T-shirt",price:10,discount:0}

তারপরে আপনার ক্লায়েন্ট কোডে (ই-শপ), আপনি আপনার পণ্যগুলিতে ছাড় যোগ করতে পারেন:

function badProduct(obj) { obj.discount+= 20; ... }
function generalDiscount(obj) { obj.discount+= 10; ... }
function distributorDiscount(obj) { obj.discount+= 15; ... }

পরে, ই-শপ মালিক বুঝতে পারে যে ছাড়টি 80% বলার চেয়ে বেশি হতে পারে না। এখন আপনাকে ক্লায়েন্ট কোডে ছাড় সংশোধনের প্রতিটি ঘটনা খুঁজে পেতে এবং একটি লাইন যুক্ত করতে হবে

if(obj.discount>80) obj.discount = 80;

তারপরে ই-শপ মালিক তার কৌশলটি আরও পরিবর্তন করতে পারে, যেমন "যদি গ্রাহক পুনরায় বিক্রয়কারী হন, সর্বাধিক ছাড় 90% হতে পারে" । এবং আপনাকে আবার একাধিক স্থানে পরিবর্তন করতে হবে এবং কৌশলগুলি যে কোনও সময় পরিবর্তিত হওয়ার সাথে সাথে আপনার এই লাইনগুলি পরিবর্তন করতে হবে। এটি একটি খারাপ নকশা। এজন্যই এনক্যাপসুলেশন হ'ল ওওপির মূল নীতি। যদি কনস্ট্রাক্টরটি এমন হত:

function Product(name,price) {
  var _name=name, _price=price, _discount=0;
  this.getName = function() { return _name; }
  this.setName = function(value) { _name = value; }
  this.getPrice = function() { return _price; }
  this.setPrice = function(value) { _price = value; }
  this.getDiscount = function() { return _discount; }
  this.setDiscount = function(value) { _discount = value; } 
}

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

function Product(name,price) {
  this.name = name;
  this.price = price;
//this.discount = 0; // <- remove this line and refactor with the code below
  var _discount; // private member
  Object.defineProperty(this,"discount",{
    get: function() { return _discount; },
    set: function(value) { _discount = value; if(_discount>80) _discount = 80; }
  });
}

// the client code
var sneakers = new Product("Sneakers",20);
sneakers.discount = 50; // 50, setter is called
sneakers.discount+= 20; // 70, setter is called
sneakers.discount+= 20; // 80, not 90!
alert(sneakers.discount); // getter is called

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

সম্পত্তি সম্পর্কে তাই অনেক। তবে জাভাস্ক্রিপ্ট সি # এর মতো খাঁটি অবজেক্ট-ভিত্তিক ভাষা থেকে আলাদা এবং বৈশিষ্ট্যগুলি আলাদাভাবে কোড করে:

সি # তে , ক্ষেত্রগুলিকে বৈশিষ্ট্যগুলিতে রূপান্তর করা একটি ব্রেকিং পরিবর্তন , সুতরাং আপনার কোডটি পৃথকভাবে সংকলিত ক্লায়েন্টে ব্যবহার করা যেতে পারে তবে সর্বজনীন ক্ষেত্রগুলি স্বতঃ-প্রয়োগকৃত বৈশিষ্ট্য হিসাবে কোড করা উচিত ।

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

  • অ্যাক্সেসর বর্ণনাকারী = পান + সেট (উপরে উদাহরণ দেখুন)
    • get একটি ফাংশন হতে হবে; এর রিটার্ন মান সম্পত্তি পড়তে ব্যবহৃত হয়; যদি নির্দিষ্ট না করা থাকে তবে ডিফল্টটি অপরিজ্ঞাত হয় , যা এমন ফাংশনের মতো আচরণ করে যা অপরিবর্তিত থাকে returns
    • সেট একটি ফাংশন হতে হবে; এর প্যারামিটারটি সম্পত্তিটির কোনও মূল্য নির্ধারণের ক্ষেত্রে আরএইচএস দিয়ে পূর্ণ; যদি নির্দিষ্ট না করা হয় তবে ডিফল্টটি অপরিজ্ঞাত , যা খালি ফাংশনের মতো আচরণ করে
  • ডেটা বর্ণনাকারী = মান + লিখনযোগ্য (নীচের উদাহরণ দেখুন)
    • মান ডিফল্ট undefined ; যদি লিখনযোগ্য , কনফিগারযোগ্য এবং গণনাযোগ্য (নীচে দেখুন) সত্য হয় তবে সম্পত্তিটি একটি সাধারণ ডেটা ক্ষেত্রের মতো আচরণ করে
    • লিখনযোগ্য - ডিফল্ট মিথ্যা ; যদি সত্য না হয়তবে সম্পত্তিটি কেবল পঠিত হয়; লেখার চেষ্টা ত্রুটি ছাড়াই উপেক্ষা করা হয় *!

উভয় বর্ণনাকারীর এই সদস্য থাকতে পারে:

  • কনফিগারযোগ্য - ডিফল্ট মিথ্যা ; যদি এটি সত্য না হয় তবে সম্পত্তিটি মোছা যাবে না; মুছে ফেলার চেষ্টা ত্রুটি ছাড়াই উপেক্ষা করা হয় *!
  • গণনাযোগ্য - ডিফল্ট মিথ্যা ; যদি সত্য হয় তবে এটি পুনরাবৃত্তি হবেfor(var i in theObject); যদি মিথ্যা হয় তবে এটি পুনরাবৃত্তি হবে না, তবে এটি সর্বজনীন হিসাবে অ্যাক্সেসযোগ্য

* যদি না কঠোর মোডে থাকে - তবে সেক্ষেত্রে জেএস টাইপআরারের মাধ্যমে কার্যকর করা বন্ধ করে দেয় যদি না এটি ট্রাই -ক্যাচ ব্লকে ধরা পড়ে

এই সেটিংস পড়তে, ব্যবহার করুন Object.getOwnPropertyDescriptor()

উদাহরণ দিয়ে শিখুন:

var o = {};
Object.defineProperty(o,"test",{
  value: "a",
  configurable: true
});
console.log(Object.getOwnPropertyDescriptor(o,"test")); // check the settings    

for(var i in o) console.log(o[i]); // nothing, o.test is not enumerable
console.log(o.test); // "a"
o.test = "b"; // o.test is still "a", (is not writable, no error)
delete(o.test); // bye bye, o.test (was configurable)
o.test = "b"; // o.test is "b"
for(var i in o) console.log(o[i]); // "b", default fields are enumerable

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

  • Object.preventExtensions (yourObject) নতুন বৈশিষ্ট্য যোগ করার জন্য বাধা দেয় yourObject । ব্যবহার করুনObject.isExtensible(<yourObject>)যদি পদ্ধতি বস্তুর উপর ব্যবহার করা হয়েছিল করো। প্রতিরোধ অগভীর (নীচে পড়ুন)।
  • ওপজেক্ট.সিল (আপনারঅজেক্ট) উপরের মত এবং বৈশিষ্ট্যগুলি সরানো যাবে না (কার্যকরভাবেconfigurable: falseসমস্ত বৈশিষ্ট্যেসেটকরে)। Object.isSealed(<yourObject>)অবজেক্টে এই বৈশিষ্ট্যটি সনাক্ত করতেব্যবহার করুন। সিলটি অগভীর (নীচে পড়ুন)।
  • ওজেক্ট.ফ্রিজে (আপনার অবজেক্ট) উপরের মত এবং বৈশিষ্ট্যগুলি পরিবর্তন করা যায় না (কার্যকরভাবেwritable: falseডেটা বর্ণনাকারী সমস্ত বৈশিষ্ট্যের সাথেসেটকরে)। সেটারের লিখনযোগ্য সম্পত্তি প্রভাবিত হয় না (যেহেতু এটির একটি নেই)। হিমটি অগভীর : এর অর্থ হ'ল সম্পত্তি যদি অবজেক্ট হয় তবে এর বৈশিষ্ট্যগুলি হিমায়িত হয় না (আপনি যদি চান তবে আপনার "ডিপ ফ্রিজ" এর মতো কিছু করা উচিত, ডিপ কপি - ক্লোনিংয়ের মতো )। Object.isFrozen(<yourObject>)এটি সনাক্ত করতেব্যবহার করুন।

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


এই অংশটি পরিষ্কার। function Product(name,price) { this.name = name; this.price = price; var _discount; // private member Object.defineProperty(this,"discount",{ get: function() { return _discount; }, set: function(value) { _discount = value; if(_discount>80) _discount = 80; } }); } var sneakers = new Product("Sneakers",20); sneakers.discount = 50; // 50, setter is called sneakers.discount+= 20; // 70, setter is called sneakers.discount+= 20; // 80, not 90! alert(sneakers.discount); // getter is called
আবু আবু

27

getএমন একটি ফাংশন যা আপনাকে যখন মানটি পড়ার চেষ্টা করে তখন ডাকা player.healthহয়:

console.log(player.health);

এটি কার্যকরভাবে এর চেয়ে আলাদা নয়:

player.getHealth = function(){
  return 10 + this.level*15;
}
console.log(player.getHealth());

গেটের বিপরীত সেট করা হয়েছে, যা আপনি যখন মূল্য নির্ধারণ করবেন তখন ব্যবহৃত হবে। যেহেতু কোনও সেটার নেই, তাই মনে হয় প্লেয়ারের স্বাস্থ্যের জন্য বরাদ্দ করা উদ্দেশ্য নয়:

player.health = 5; // Doesn't do anything, since there is no set function defined

খুব সাধারণ উদাহরণ:

var player = {
  level: 5
};

Object.defineProperty(player, "health", {
  get: function() {
    return 10 + (player.level * 15);
  }
});

console.log(player.health); // 85
player.level++;
console.log(player.health); // 100

player.health = 5; // Does nothing
console.log(player.health); // 100


এটি ঠিক এমন কোনও ফাংশনের মতো যা আপনাকে ()কল করার জন্য আসলে ব্যবহার করার দরকার নেই ... তারা বুঝতে পারে না তারা যখন এই জিনিসটি আবিষ্কার করেছিল তখন ধারণাটি কী ছিল। ফাংশনগুলি সম্পূর্ণ এক: jsbin.com/bugipi/edit?js,console
vsync

15

DefineProperty অবজেক্টের একটি পদ্ধতি যা আপনাকে কয়েকটি মানদণ্ড পূরণের জন্য বৈশিষ্ট্যগুলি কনফিগার করতে দেয়। এখানে অগ্রাহ্য দ্বারা দুই বৈশিষ্ট firstname & LASTNAME এবং পরিশেষে যোগ দুই বৈশিষ্ট্য সঙ্গে একজন কর্মী বস্তুর সঙ্গে একটি সহজ উদাহরণ toString বস্তুর উপর পদ্ধতি।

var employee = {
    firstName: "Jameel",
    lastName: "Moideen"
};
employee.toString=function () {
    return this.firstName + " " + this.lastName;
};
console.log(employee.toString());

আপনি আউটপুট হিসাবে পাবেন: জামিল ময়দিন

আমি অবজেক্টে DefineProperty ব্যবহার করে একই কোড পরিবর্তন করতে যাচ্ছি

var employee = {
    firstName: "Jameel",
    lastName: "Moideen"
};
Object.defineProperty(employee, 'toString', {
    value: function () {
        return this.firstName + " " + this.lastName;
    },
    writable: true,
    enumerable: true,
    configurable: true
});
console.log(employee.toString());

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

আপনি যদি উদাহরণটি চালান তবে আপনি আউটপুট এরূপে পাবেন: জামিল মইদিন

আসুন বুঝতে পারি কেন আমাদের লেখার যোগ্য, গণনাযোগ্য এবং কনফিগারযোগ্য তিনটি বৈশিষ্ট্য দরকার

লিখনযোগ্য

জাভাস্ক্রিপ্টের খুব বিরক্তিকর একটি অংশ হ'ল যদি আপনি টাস্টস্ট্রিং সম্পত্তিটিকে অন্য কোনও কিছুতে উদাহরণস্বরূপ পরিবর্তন করেন

এখানে চিত্র বর্ণনা লিখুন

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

গণনীয়

আপনি যদি বস্তুর ভিতরে থাকা সমস্ত কীগুলি মুদ্রণ করেন তবে আপনি টসস্ট্রিং সহ সমস্ত বৈশিষ্ট্য দেখতে পাবেন।

console.log(Object.keys(employee));

এখানে চিত্র বর্ণনা লিখুন

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

কনফিগার

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

var employee = {
    firstName: "Jameel",
    lastName: "Moideen"
};
Object.defineProperty(employee, 'toString', {
    value: function () {
        return this.firstName + " " + this.lastName;
    },
    writable: false,
    enumerable: false,
    configurable: true
});

//change enumerable to false
Object.defineProperty(employee, 'toString', {

    enumerable: true
});
employee.toString="changed";
console.log(Object.keys(employee));

এখানে চিত্র বর্ণনা লিখুন

আপনি এই আচরণটি মিথ্যাতে কনফিগারযোগ্য সেট করে সীমাবদ্ধ করতে পারেন।

এই তথ্যের মূল উল্লেখটি আমার ব্যক্তিগত ব্লগ থেকে


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

@ জ্যাককেগপিল আপনি ঠিক বলেছেন। আমি স্ক্রিন শটের পরিবর্তে কোড যুক্ত করে আপডেট করব
কোড-ইজেড

3

মূলত, definePropertyএমন একটি পদ্ধতি যা 3 টি প্যারামিটারে লাগে - একটি বস্তু, একটি সম্পত্তি এবং একটি বর্ণনাকারী। কি এই বিশেষ কলে ঘটছে তা হয় "health"সম্পত্তির playerবস্তুর 10 প্লাস 15 বার যে প্লেয়ার বস্তুর স্তর নির্ধারিত হচ্ছে।


0

হ্যাঁ সেটআপ সেটারের জন্য আর কোনও ক্রিয়াকলাপ প্রসারিত নয় এবং এটি আমার উদাহরণ হ'ল অবজেক্ট.ডেফাইনপ্রোপার্টি (অবজেক্ট, নাম, ফানক)

var obj = {};
['data', 'name'].forEach(function(name) {
    Object.defineProperty(obj, name, {
        get : function() {
            return 'setter & getter';
        }
    });
});


console.log(obj.data);
console.log(obj.name);

0

অবজেক্ট.ডিফাইনপ্রোপার্টি () হ'ল একটি গ্লোবাল ফাংশন..এটি ফাংশনের ভিতরে পাওয়া যায় না যা বস্তুটি অন্যথায় ঘোষণা করে। আপনাকে স্ট্যাটিকালি এটি ব্যবহার করতে হবে ...


0

সারসংক্ষেপ:

Object.defineProperty(player, "health", {
    get: function () {
        return 10 + ( player.level * 15 );
    }
});

Object.definePropertyপ্লেয়ার অবজেক্টে নতুন সম্পত্তি তৈরি করতে ব্যবহৃত হয়। Object.definePropertyএটি এমন একটি ফাংশন যা জেএস রানটাইম এনভায়রনমেন্টে মূলত উপস্থিত এবং নিম্নলিখিত যুক্তিগুলি গ্রহণ করে:

Object.defineProperty(obj, prop, descriptor)

  1. যে বস্তুর উপর আমরা একটি নতুন সম্পত্তি সংজ্ঞায়িত করতে চাই
  2. নতুন সম্পত্তির নাম আমরা সংজ্ঞায়িত করতে চান
  3. বর্ণনাকারী অবজেক্ট

বর্ণনাকারী অবজেক্টটি আকর্ষণীয় অংশ। এখানে আমরা নিম্নলিখিত জিনিসগুলি সংজ্ঞায়িত করতে পারি:

  1. কনফিগারযোগ্য <boolean> : যদি true সম্পত্তি বর্ণনাকারী পরিবর্তিত হতে পারে এবং সম্পত্তিটি বস্তু থেকে মুছে ফেলা হতে পারে। কনফিগারযোগ্য যদি falseবিবরণী বৈশিষ্ট্য হয় যা উত্তীর্ণ হয় Object.definePropertyপরিবর্তন করা যায় না।
  2. লিখনযোগ্য <boolean> : যদি trueঅ্যাসাইনমেন্ট অপারেটর ব্যবহার করে সম্পত্তি ওভাররাইট করা যায়।
  3. গণনাযোগ্য <boolean> : true সম্পত্তিটি যদি একটি for...inলুপে পুনরাবৃত্তি করা যায় । এছাড়াও Object.keysফাংশনটি ব্যবহার করার সময় কী উপস্থিত থাকবে। সম্পত্তিটি থাকলে falseতারা for..inলুপ ব্যবহার করে পুনরাবৃত্তি হবে না এবং ব্যবহারের সময় প্রদর্শিত হবে না Object.keys
  4. get <function> : একটি ফাংশন যা বলা হয় যখনই সম্পত্তি প্রয়োজন হয়। প্রত্যক্ষ মান দেওয়ার পরিবর্তে এই ফাংশনটি বলা হয় এবং প্রত্যাবর্তিত মানটি সম্পত্তির মান হিসাবে দেওয়া হয়
  5. সেট <function> : একটি ফাংশন যা বলা হয় যখনই সম্পত্তি নির্ধারিত হয়। প্রত্যক্ষ মান নির্ধারণের পরিবর্তে এই ফাংশনটি বলা হয় এবং প্রত্যাবর্তিত মানটি সম্পত্তিটির মান নির্ধারণ করতে ব্যবহৃত হয়।

উদাহরণ:

const player = {
  level: 10
};

Object.defineProperty(player, "health", {
  configurable: true,
  enumerable: false,
  get: function() {
    console.log('Inside the get function');
    return 10 + (player.level * 15);
  }
});

console.log(player.health);
// the get function is called and the return value is returned as a value

for (let prop in player) {
  console.log(prop);
  // only prop is logged here, health is not logged because is not an iterable property.
  // This is because we set the enumerable to false when defining the property
}


0

import { CSSProperties } from 'react'
import { BLACK, BLUE, GREY_DARK, WHITE } from '../colours'

export const COLOR_ACCENT = BLUE
export const COLOR_DEFAULT = BLACK
export const FAMILY = "'Segoe UI', sans-serif"
export const SIZE_LARGE = '26px'
export const SIZE_MEDIUM = '20px'
export const WEIGHT = 400

type Font = {
  color: string,
  size: string,
  accent: Font,
  default: Font,
  light: Font,
  neutral: Font,
  xsmall: Font,
  small: Font,
  medium: Font,
  large: Font,
  xlarge: Font,
  xxlarge: Font
} & (() => CSSProperties)

function font (this: Font): CSSProperties {
  const css = {
    color: this.color,
    fontFamily: FAMILY,
    fontSize: this.size,
    fontWeight: WEIGHT
  }
  delete this.color
  delete this.size
  return css
}

const dp = (type: 'color' | 'size', name: string, value: string) => {
  Object.defineProperty(font, name, { get () {
    this[type] = value
    return this
  }})
}

dp('color', 'accent', COLOR_ACCENT)
dp('color', 'default', COLOR_DEFAULT)
dp('color', 'light', COLOR_LIGHT)
dp('color', 'neutral', COLOR_NEUTRAL)
dp('size', 'xsmall', SIZE_XSMALL)
dp('size', 'small', SIZE_SMALL)
dp('size', 'medium', SIZE_MEDIUM)

export default font as Font


0

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

দ্রষ্টব্য: আপনি এই পদ্ধতিটি অবজেক্ট টাইপের উদাহরণ না দিয়ে সরাসরি অবজেক্ট কনস্ট্রাক্টরে কল করেন।

   const object1 = {};
   Object.defineProperty(object1, 'property1', {
      value: 42,
      writable: false, //If its false can't modify value using equal symbol
      enumerable: false, // If its false can't able to get value in Object.keys and for in loop
      configurable: false //if its false, can't able to modify value using defineproperty while writable in false
   });

এখানে চিত্র বর্ণনা লিখুন

সম্পত্তি সংজ্ঞা সম্পর্কে সহজ ব্যাখ্যা।

উদাহরণ কোড: https://jsfiddle.net/manoj_antony32/pu5n61fs/


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