"নতুন" অপারেটরটি ব্যবহার করে কোনও অবজেক্ট তৈরি করার সময় আমরা বন্ধনীগুলি বাদ দিতে পারি?


229

আমি এইভাবে অবজেক্টগুলি তৈরি হতে দেখেছি:

const obj = new Foo;

তবে আমি ভেবেছিলাম যে কোনও অবজেক্ট তৈরি করার সময় বন্ধনীগুলি optionচ্ছিক নয়:

const obj = new Foo();

ECMAScript স্ট্যান্ডার্ডে অবজেক্ট তৈরির পূর্বের পদ্ধতিটি কি বৈধ এবং সংজ্ঞায়িত? পূর্ববর্তী জিনিসগুলি তৈরির পদ্ধতি এবং পরবর্তীগুলির মধ্যে কোনও পার্থক্য রয়েছে? একজনের কি অন্যের চেয়ে বেশি পছন্দ হয়?



আপডেট করা রেফারেন্স: ECMAScript 2017 .312.3.3 নতুন ওপারেটর
রবিজি

টি এল; ডিআর: সতর্ক থাকুন যে new a.b()থেকে ভিন্ন new a().b()যে, সাবেক ক্ষেত্রে, a.bপ্রথম, অ্যাক্সেস করা হয় যেহেতু পরেরটির ক্ষেত্রে, একটি নতুন aপ্রথম তৈরি করা হয়।
অ্যান্ড্রু

উত্তর:


238

ডেভিড ফ্লানাগান 1 এর উদ্ধৃতি :

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

o = new Object;  // Optional parenthesis omitted here
d = new Date();  

...

ব্যক্তিগতভাবে, আমি সর্বদা প্রথম বন্ধনী ব্যবহার করি, এমনকি যখন কনস্ট্রাক্টর কোনও আর্গুমেন্ট না নেয়।

এছাড়াও, জেএসলিন্ট আপনার অনুভূতিতে আঘাত করতে পারে যদি আপনি প্রথম বন্ধনী বাদ দেন। এটি প্রতিবেদন করে Missing '()' invoking a constructor, এবং প্রথম বন্ধনী বাদ দেওয়া সহ্য করার জন্য সরঞ্জামটির পক্ষে কোনও বিকল্প বলে মনে হচ্ছে না।


1 ডেভিড ফ্লানাগান: জাভাস্ক্রিপ্টের সংজ্ঞা নির্দেশিকা: চতুর্থ সংস্করণ (পৃষ্ঠা 75)


6
জেএসলিন্ট কেন প্রথম বন্ধনী ব্যবহারকে উত্সাহ দেয়?
র্যান্ডমব্লু

11
আমার ধারণা এটি কেবল আরও সামঞ্জস্যপূর্ণ বলে বিবেচিত হয়।
ড্যানিয়েল ভ্যাসালো 13

12
আমি দেখতে আকর্ষণীয় মনে করি যে অনেক জাভাস্ক্রিপ্ট বিকাশকারীরা কেবল "সরঞ্জাম (জেএসলিন্ট) তাদের এটি করতে বলেছিল" কারণ প্যারেন্টেসিসগুলি ব্যবহার করে ", বিশেষত বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / গুয়াইডের উদাহরণ বিবেচনা করে /… , "ছেলেরা যারা << কার্যকর> ভাষা আবিষ্কার করেছেন" new Classথেকে প্যারামিটারলেস কনস্ট্রাক্টরের জন্য কোনও বন্ধনী ব্যবহার করবেন না । যদি এটি 'মতামত' বানান না করে, আমি জানি না কী করে ...
ack

52
@ ঠিক আছে, ভাষার উদ্ভাবকরা তাদের ভাষার কিছু বৈশিষ্ট্য প্রদর্শন না করা অদ্ভুত হবে (এই ক্ষেত্রে, নির্মাতাদের উপর প্রথম বন্ধনী বাদ দেওয়ার বিকল্প)। যদি তারা বৈশিষ্ট্যটি যুক্ত না করে থাকে তবে আমরা এটি জিজ্ঞাসা করব না যে এটি প্রথম স্থানে ব্যবহার করা উচিত। এটি ব্যবহার না করার একটি ব্যবহারিক কারণ এটি: এর new Object.func()সমতুল্য নয় new Object().func()। সর্বদা বন্ধনী অন্তর্ভুক্ত করে, এই ভুল করার সম্ভাবনাটি কেটে যায়।
nmclean

2
আপনি যদি কোনও ভুল করার সম্ভাবনাটি দূর করতে চান তবে আপনার ব্যবহার করা উচিত (new Object).func()। তবে আমি অতিরিক্ত ভাষা হিসাবে এবং অতিরিক্ত সমান চিহ্নগুলি ব্যবহার করার বিষয়টি বিবেচনা করি, যেমন ==বনাম ===, আপনার ভাষা না শিখার জন্য একটি খারাপ অজুহাত।
জিন ভিনসেন্ট

78

উভয়ের মধ্যে পার্থক্য রয়েছে:

  • new Date().toString() পুরোপুরি কাজ করে এবং বর্তমান তারিখটি ফেরত দেয়
  • new Date.toString()" প্রকারের ত্রুটি: তারিখ.টোস্ট্রিং কোনও নির্মাণকারী নয় "

এটি ঘটে কারণ new Date()এবং এর new Dateআলাদা নজির রয়েছে। এমডিএন অনুসারে জাভাস্ক্রিপ্ট অপারেটর অগ্রাধিকার সারণীর অংশটি দেখতে আমাদের আগ্রহী:

╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
 Precedence         Operator type         Associativity   Operators  
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
     18      Member Access                left-to-right   .        
             Computed Member Access       left-to-right    [  ]    
             new (with argument list)     n/a            new  (  ) 
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
     17      Function Call                left-to-right   (  )     
             new (without argument list)  right-to-left  new        
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝

এই টেবিল থেকে নিম্নলিখিত:

  1. new Foo() এর চেয়ে বেশি অগ্রাধিকার রয়েছে new Foo

    new Foo().অপারেটরের মতো একই নজির রয়েছে

    new Foo.অপারেটরের চেয়ে এক স্তরের নিম্নতর অগ্রাধিকার রয়েছে

    new Date().toString() নিখুঁতভাবে কাজ করে কারণ এটি হিসাবে মূল্যায়ন করে (new Date()).toString()

    new Date.toString()" প্রকারের ত্রুটি: তারিখ.আর স্ট্রিং কোনও নির্মাণকারী নয় " কারণ (এবং তারপরে "ফাংশন কল" এর .চেয়ে উচ্চতর অগ্রাধিকার রয়েছে new Date) এবং অভিব্যক্তিটি হিসাবে মূল্যায়ন করে(new (Date.toString))()

    … [ … ]অপারেটরের ক্ষেত্রে একই যুক্তি প্রয়োগ করা যেতে পারে ।

  2. new Fooকরেছে ডান-থেকে-বাম associativity এবং জন্য new Foo()"associativity" প্রযোজ্য নয়। আমি মনে করি অনুশীলনে এটি কোনও পার্থক্য করে না। অতিরিক্ত তথ্যের জন্য এই এসও প্রশ্নটি দেখুন


একজনের কি অন্যের চেয়ে বেশি পছন্দ হয়?

সমস্ত কিছু জেনে, এটি ধরে নেওয়া যায় যে new Foo()পছন্দ করা হয় preferred


4
অবশেষে, যে কেউ আসলে প্রশ্নের উত্তর দেয় এবং সূক্ষ্ম পার্থক্যটি নির্দেশ করে!
gcampbell

ওহ ধন্যবাদ. আমাকে অন্য ভাষার কথা মনে করিয়ে দেয় en.wikedia.org/wiki/Brainfuck
জন হেন্কেল

ওয়েল ব্যাখ্যা, অফার ঠিক যে কারণে new Foo()বেশী প্রাধান্য দিতে হবে new Foo। এখন পর্যন্ত সেরা উত্তর।
কোডলামা

দুর্দান্ত উত্তর, অগ্রাধিকার সারণী এবং তার সাথে দেওয়া ব্যাখ্যা এটি সম্পূর্ণ পরিষ্কার করে দেয়। আপনি খুশি new Object().something()হলেন যে কীভাবে এটি লেখার পাশাপাশি ঠিক করে দেয় (new Object()).something()
লিটল টাইগার

1
দুর্দান্ত ব্যাখ্যা কিন্তু আমি উপসংহারের সাথে একমত নই এবং এখনও মনে করি আপনি যদি আপনার ভাষা জানেন তবে প্রথম বন্ধনী ব্যবহার না করা ঠিক is বিটিডাব্লু যদি আপনি জেএসের নজরে না জানেন তবে আপনি (new Date).toString()একই অক্ষর গণনা এবং এর চেয়ে আরও স্পষ্টত ব্যবহার করতে পারেন new Date().toString
জিন ভিনসেন্ট

14

আপনি "নতুন" অপারেটরটি ব্যবহার করার সময় কোনও পার্থক্য আছে বলে আমি মনে করি না। এই দুটি অভ্যাসে প্রবেশ করার বিষয়ে সতর্ক থাকুন, কারণ এই দুটি লাইনের কোড একই নয়:

var someVar = myFunc; // this assigns the function myFunc to someVar
var someOtherVar = myFunc(); // this executes myFunc and assigns the returned value to someOtherVar

1
আরও বেশি সমস্যাযুক্ত যদি আপনি সেমিকোলন বাদ দেওয়ার অভ্যাসে থাকেন। ;-)
রবিজি

13

পাস করার জন্য যদি আপনার কাছে তর্ক না থাকে তবে প্রথম বন্ধনী alচ্ছিক। এগুলি ছাড়াই কেবল সিনট্যাকটিক চিনি।


8
আমি সিনট্যাকটিক লবণ বলব, তবে ymmv।
থমাস এডিং

আমি তাদের বলব যদি তাদের প্রয়োজন না হয় তবে যুক্ত করা হ'ল সিনট্যাকটিক চিনি। :)
কোজবি

8

https://people.mozilla.org/~jorendorff/es6-draft.html#sec-new-operator-runtime-semantics-evaluation

এখানে ES6 টি অনুচ্ছেদের অংশ রয়েছে যা দুটি রূপটি কীভাবে পরিচালনা করে তা নির্ধারণ করে। নন-প্রথম বন্ধনী বৈকল্পিক একটি খালি আর্গুমেন্ট তালিকা পাস করে।

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

new Array.length // fails because Array.length is the number 1, not a constructor
new Array().length // 0

এটি ES5 এবং ES3 তেও ভালভাবে সংজ্ঞায়িত করা হয়েছে - "[[নির্মাণ]] নির্মাণকারীর অভ্যন্তরীণ পদ্ধতিটি কল করার ফলাফলটি ফিরিয়ে দিন, কোনও আর্গুমেন্ট সরবরাহ না করে (এটি আর্গুমেন্টের খালি তালিকা)" "
বেনিয়ামিন গ্রুইনবাউম

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