ES6 গিটার / তীর ফাংশন সহ সেটার


106

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

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

কিন্তু বৈশিষ্ট্যগুলির জন্য তীর ফাংশনটি কাজ করে না

এইটা কাজ করে:

get status() { return this.xhr.status; }

কিন্তু আমি ব্যবহার করতে পারি না

get status = () => this.xhr.status;

এটা কি ইচ্ছাকৃত?


আপনার কোঁকড়া বন্ধনী বা রিটার্নের দরকার নেই; আপনি শুধু বলতে পারেন (method, url, something) => this.xhr.open(method. url, something)

getআক্ষরিক বা শ্রেণি সংজ্ঞার একটি অঙ্গ, একটি পরিবর্তনশীল অ্যাসাইনমেন্ট হয় না। আপনারা কেন মনে করেন যে তাদের একসাথে কাজ করা উচিত?
বার্গি

4
status => this.xhr.status(সি # synt বাক্য গঠন) বা সম্ভবত get status() => this.xhr.statusপাঠযোগ্যতার জন্য দুর্দান্ত সিনট্যাক্সিক চিনি হতে পারে তবে জাভাস্ক্রিপ্ট নয় টাইপসক্রিপ্ট এটি সমর্থন করে না (এখনও?)
চার্লস হেটিয়ার

উত্তর:


113

ES2015 ব্যাকরণ অনুসারে, অবজেক্টের আক্ষরিক একটি সম্পত্তি কেবল চারটি জিনিসের মধ্যে একটি হতে পারে:

সম্পত্তি সংজ্ঞা :

  • আইডেন্টিফায়ার রেফারেন্স
  • প্রপার্টিমনাম : এসাইনমেন্টএক্সপ্রেশন
  • মেথডডিফিনিশন

এই ধরণের একমাত্র যা নেতৃত্বের অনুমতি দেয় getতা হ'ল মেথডডিফিনিশন :

পদ্ধতিপরিচয় :

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • জেনারেটর মেঠোড
  • get সম্পত্তি নাম ( ) { ফাংশনবডি }
  • set প্রপার্টি নাম ( প্রপার্টিসেটপ্যারামিটারলিস্ট ) { ফাংশনবডি) }

আপনি দেখতে পাচ্ছেন যে getফর্মটি খুব সীমিত ব্যাকরণ অনুসরণ করে যা অবশ্যই ফর্মের হতে হবে

get NAME () { BODY }

ব্যাকরণ ফর্মের ফাংশনগুলিকে অনুমতি দেয় না get NAME = ...


আপনার সাহায্যের জন্য ধন্যবাদ, আমি আপনার উত্তর গ্রহণ করি। আপনি কি জানেন যে এটি কোথায় সংজ্ঞায়িত হয়েছে যে গেটার / সেটার কোনও অ্যাসাইনমেন্টের সাথে ব্যবহার করা যাবে না? উৎসুক.
গ্যাবর ডোলা

@ গ্যাবরডোল্লা সম্পাদিত ECMAScript সূত্রে বস্তুর আক্ষরিক ব্যাকরণটি উল্লেখ করতে।
অ্যাপসিলাররা

39

গৃহীত উত্তরটি দুর্দান্ত। আপনি যদি কমপ্যাক্ট "তীর ফাংশন সিনট্যাক্স" এর পরিবর্তে সাধারণ ফাংশন সিনট্যাক্স ব্যবহার করতে চান তবে এটি সেরা

তবে সম্ভবত আপনি তীর ফাংশন পছন্দ করেন; হতে পারে আপনি অন্য কারণে তীর ফাংশনটি ব্যবহার করেন যা একটি সাধারণ ফাংশন সিনট্যাক্স প্রতিস্থাপন করতে পারে না ; আপনার আলাদা সমাধান দরকার হতে পারে।

উদাহরণস্বরূপ, আমি ওপি ব্যবহার লক্ষ্য করেছি this, আপনি লেজিকভাবে বাঁধতেthis চাইতে পারেন ; ওরফে "এটির নন-বাঁধাই করা" ), এবং তীর ফাংশনগুলি এই লেজিকাল বাইন্ডিংয়ের পক্ষে ভাল।

আপনি এখনও Object.definePropertyকৌশলটির মাধ্যমে গেটর সহ একটি তীর ফাংশন ব্যবহার করতে পারেন ।

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

কৌশল উল্লেখ (ওরফে দেখুন )object initializationget NAME() {...} ) বনাম definePropertyকৌশল (ওরফে get : ()=>{}) । কমপক্ষে একটি উল্লেখযোগ্য পার্থক্য রয়েছে, ব্যবহারের definePropertyজন্য ভেরিয়েবলগুলি ইতিমধ্যে বিদ্যমান রয়েছে:

বিদ্যমান বস্তুগুলির উপর একটি গেটর সংজ্ঞা দেওয়া হচ্ছে

অর্থাত্ Object.defineProperty আপনার অবশ্যই নিশ্চিত করতে হবে যে your_obj(আমার উদাহরণে) বিদ্যমান এবং একটি পরিবর্তনশীল হিসাবে সংরক্ষণ করা হয়েছে (যেখানে একটি দিয়ে object-initializationআপনি আপনার অবজেক্টের সূচনাতে কোনও বস্তু-আক্ষরিক ফিরিয়ে দিতে পারেন {..., get(){ }, ... }:)। বিশেষত এখানে আরও তথ্যObject.defineProperty

Object.defineProperty(...) এর সাথে তুলনীয় ব্রাউজার সমর্থন রয়েছে বলে মনে হয় get NAME(){...}সিনট্যাক্সের ; আধুনিক ব্রাউজারগুলি, আইই 9।


11
চালাক, তবে এটি চূড়ান্তভাবে আরও অনেক বেশি get status() { return this.xhr.status; }
ভার্বোজ

4
@ ডিভাক্সার আমি সম্মত হলাম এটি খুব ভার্জোজ। তবে কেবল পরিষ্কার করার জন্য, আপনার this অবশ্যই সেই অবজেক্ট হতে হবে যেখানে আপনার get status() { ... }সংজ্ঞা দেওয়া হয়েছে। কিন্তু আমার this পারে , ডান আভিধানিক বাঁধাই পার্থক্যের কারণে অন্য কিছু হতে?
লাল মটর

4
সম্মত হন ... যদিও বাস্তবে, আমি এমন কোনও ক্ষেত্রে যাইনি যেখানে thisআমি প্রাপক অ্যাক্সেসরে যা চাই তা নয়। ( thisইভেন্ট হ্যান্ডলার এবং কলব্যাকের মতো, চারপাশে ফাংশনগুলি পাস করার সময় তীরের ফাংশনগুলির বাধ্যতামূলক সুবিধা কার্যকর হবে বলে মনে হয়))
ডিভাক্সার

4
আমি সম্মত, আমি প্রায়শই যেমন প্রতিশ্রুতিতে()=>{} প্রেরণ করি সেই কলব্যাকগুলির জন্য আমি প্রায়শই ফ্যাট অ্যার + লেজিকাল বাইন্ডিং ব্যবহার করি । আমি যদি ফ্যাট-তীর ব্যবহার না করি তবে বৈশ্বিক বস্তুর প্রতিনিধিত্ব করবে ; খুব দরকারী না। তবে আমি খুব কমই (কখনও?) আপনার "উইন্ডোজ অ্যাক্সেসর" হিসাবে ফাংশন হিসাবে ব্যবহার করেছি ... কমপক্ষে অভ্যন্তরের অভ্যন্তরটি যে উপায়ে সংজ্ঞায়িত হয়েছে তা উপস্থাপন করবে (যা ইতিমধ্যে এর চেয়ে বেশি কার্যকর ; তাই ব্যবহার করার দরকার নেই) একটি ফ্যাট-এ্যার ফাংশন!)$http(...).then((promise_result)=> this...}))thisWindow()=>{}thisget()get()Window
রেড মটর

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