জাভাস্ক্রিপ্টের "নতুন" কীওয়ার্ডটি ক্ষতিকারক হিসাবে বিবেচিত? [বন্ধ]


568

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

তবুও, গতকাল আমি YUI থিয়েটারে ডগলাস ক্রকফোর্ডের বক্তব্যটি দেখছিলাম এবং তিনি ঠিক একই কথাটি বলেছিলেন যে তিনি newতাঁর কোডটিতে আর কীওয়ার্ডটি ব্যবহার করেন নি ( জাভাস্ক্রিপ্টে ক্রকফোর্ড - আইন তৃতীয়: ফাংশন দ্য আলটিমেট - 50:23 মিনিট )।

newকীওয়ার্ডটি ব্যবহার করা 'খারাপ' ? এটি ব্যবহারের সুবিধা এবং অসুবিধাগুলি কী কী?


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

5
আমি এটা বুঝতে পারি না। একদিকে ডগ এর ব্যবহারকে নিরুৎসাহিত করে new। তবে আপনি যখন YUI গ্রন্থাগারের দিকে তাকান। আপনি newসর্বত্র ব্যবহার করতে হবে । যেমন var myDataSource = new Y.DataSource.IO({source:"./myScript.php"});
আদিত্য_গৌর

2
@ আদিত্য_গৌর কারণ এটি যদি আপনার কোনও অবজেক্টের কিছু সূচনা প্রয়োজন হয় initতবে আপনি যদি কোনও পদ্ধতির ব্যবহার করতে চান Object.createএবং পরে কল করে থাকেন তবে আপনাকে একটি পদ্ধতি হ্যাক করতে হবে। newউভয়ই করে যা ব্যবহার করা অনেক সহজ , প্রোটোটাইপ চেইন সেট করে এবং কিছু প্রাথমিককরণ কোডকে কল করে।
জুয়ান মেন্ডেস

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

2
টিএলডিআর: ব্যবহার newকরা বিপজ্জনক নয়। ছাড় দেওয়া newবিপজ্জনক, এবং তাই খারাপ । তবে ইএস 5 এ আপনি স্ট্রিক্ট মোড ব্যবহার করতে পারেন যা আপনাকে সেই বিপদ থেকে এবং আরও অনেককে রক্ষা করে।
জেকেদেব

উত্তর:


603

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

মূলশব্দ দ্বারা প্রদত্ত কার্যকারিতাটির ব্যবহার newস্ক্র্যাচ থেকে প্রতিটি বস্তু তৈরির বিভিন্ন সুবিধা রয়েছে:

  1. প্রোটোটাইপ উত্তরাধিকার । শ্রেণিভিত্তিক ওও ভাষাগুলিতে অভ্যস্ত লোকদের দ্বারা প্রায়শই সন্দেহ এবং উপহাসের মিশ্রণের সাথে নজর দেওয়া হলেও জাভাস্ক্রিপ্টের নেটিভ উত্তরাধিকার কৌশল কোডটি পুনরায় ব্যবহারের একটি সহজ এবং আশ্চর্যজনক কার্যকর উপায় means এবং নতুন কীওয়ার্ডটি হ'ল এটি ব্যবহারের মাধ্যমটি (এবং কেবলমাত্র উপলব্ধ ক্রস প্ল্যাটফর্ম)।
  2. কর্মক্ষমতা. এটি # 1 এর পার্শ্ব-প্রতিক্রিয়া: আমি যদি তৈরি করি প্রতিটি বস্তুতে 10 টি পদ্ধতি যুক্ত করতে চাই, আমি কেবল একটি ক্রিয়াকলাপ লিখতে পারতাম যা প্রতিটি নতুন অবজেক্টে ম্যানুয়ালি প্রতিটি পদ্ধতি নির্ধারিত করে ... বা, আমি তাদের এগুলিকে নির্ধারণ করতে পারতাম সৃষ্টি ফাংশন prototypeএবং newনতুন বস্তু স্ট্যাম্প আউট ব্যবহার । কেবল এটিই দ্রুত নয় (প্রোটোটাইপের প্রতিটি পদ্ধতির জন্য কোনও কোডের প্রয়োজন নেই), এটি প্রতিটি পদ্ধতির জন্য পৃথক বৈশিষ্ট্যযুক্ত প্রতিটি বস্তুকে বেলুন করা এড়িয়ে চলে। ধীর মেশিনগুলিতে (বা বিশেষত ধীর জেএস দোভাষী) যখন অনেকগুলি অবজেক্ট তৈরি করা হয় তার অর্থ সময় এবং স্মৃতিতে একটি উল্লেখযোগ্য সঞ্চয় হতে পারে।

এবং হ্যাঁ, newএর একটি গুরুতর অসুবিধা রয়েছে, অন্য উত্তরগুলির দ্বারা একেবারে বর্ণিত: আপনি যদি এটি ব্যবহার করতে ভুলে যান তবে আপনার কোডটি সতর্কতা ছাড়াই ভেঙে যাবে। ভাগ্যক্রমে, সেই অসুবিধা সহজেই হ্রাস করা যায় - কেবল ফাংশনে নিজেই কিছুটা কোড যুক্ত করুন:

function foo()
{
   // if user accidentally omits the new keyword, this will 
   // silently correct the problem...
   if ( !(this instanceof foo) )
      return new foo();

   // constructor logic follows...
}

newদুর্ঘটনাক্রমে অপব্যবহারের কারণে সৃষ্ট সমস্যা সম্পর্কে চিন্তা না করে এখন আপনার সুবিধা থাকতে পারে । এমনকি যদি ভাঙা কোডটি নীরবে কাজ করার চিন্তা আপনাকে বিরক্ত করে তবে আপনি এই চেকটিতে একটি যুক্তি যুক্ত করতে পারেন। বা, কিছু মন্তব্য হিসাবে , একটি রানটাইম ব্যতিক্রম প্রবর্তন করতে চেক ব্যবহার করুন:

if ( !(this instanceof arguments.callee) ) 
   throw new Error("Constructor called as a function");

(নোট করুন যে এই স্নিপেটটি কন্সট্রাক্টর ফাংশনটির নামটি হার্ড-কোডিং এড়াতে সক্ষম হয়েছে, পূর্ববর্তী উদাহরণের বিপরীতে এটি আসলে বস্তুর তাত্ক্ষণিককরণ করার প্রয়োজন নেই - অতএব, এটি প্রতিটি লক্ষ্য ফাংশনে কোনও সংশোধন ছাড়াই অনুলিপি করা যেতে পারে))

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


96
যদি (! (এই উদাহরণস্বরূপ আর্গুমেন্টস.কলে)) ত্রুটি ("ফাংশন হিসাবে পরিচিত কনস্ট্রাক্টর") নিক্ষেপ করা হয়; // আরও জেনেরিক, কনস্ট্রাক্টরদের নামের জ্ঞানের প্রয়োজন নেই, ব্যবহারকারীকে কোডটি ঠিক করুন make
কিছু

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

65
arguments.calleeআপনাকে কল করা হয়েছে কিনা তা যাচাই করার জন্য ব্যবহার newকরা এত ভাল নাও হতে পারে, যেহেতু arguments.calleeকড়া মোডে পাওয়া যায় না। ফাংশনটির নাম ব্যবহার করা ভাল।
শান ম্যাকমিলান

69
যদি আমি কোনও শনাক্তকারীকে ভুল বানান লিখি তবে আমার কোডটি বিরতি। আমি কি সনাক্তকারী ব্যবহার করব না? ব্যবহার না করা newকারণ আপনি এটি আপনার কোডটিতে লিখতে ভুলে যেতে পারেন আমার উদাহরণের মতোই তাত্পর্যপূর্ণ।
টমাস এডিং

16
আপনি যদি কঠোর মোড চালু করেন, আপনি যদি নতুনটি ব্যবহার করতে ভুলে যান তবে আপনি এটি ব্যবহার করার চেষ্টা করলে আপনি একটি ব্যতিক্রম পাবেন: yuiblog.com/blog/2010/12/14/strict-mode-is- आगामी-to-town এটি প্রতিটি কন্সট্রাক্টরের চেক উদাহরণ যোগ করার চেয়ে সহজ।
স্টেফেনবেজ

182

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

এর মাধ্যমে সুইচ পড়ার বিষয়ে:

আমি কখনও স্যুইচ কেসগুলিকে পরের মামলায় পড়তে দেই না। কেন কখনও কখনও দরকারী হয়ে পড়েছিল সে সম্পর্কে সজাগ বক্তব্য দেওয়ার পরপরই আমি আমার কোডটিতে একটি ত্রুটি পেয়েছিলাম immediately (পৃষ্ঠা 97, আইএসবিএন 978-0-596-51774-8)

প্রায় ++ এবং -

++ (ইনক্রিমেন্ট) এবং - (হ্রাস) অপারেটররা ক্ষতিকারক কৌশলগুলিকে উত্সাহিত করে খারাপ কোডে অবদান রাখার জন্য পরিচিত known তারা ভাইরাস এবং অন্যান্য সুরক্ষা বিঘ্ন সক্ষম করার ক্ষেত্রে ত্রুটিপূর্ণ স্থাপত্যের পরে দ্বিতীয়। (পৃষ্ঠা 122)

নতুন সম্পর্কে:

আপনি অন্তর্ভুক্ত করতে ভুলে যান তাহলে নতুন একটি কন্সট্রাকটর ফাংশন কলিং উপসর্গ, তারপর এই নতুন অবজেক্ট বাধ্য করা হবে না। দুঃখিতভাবে, এই বৈশ্বিক বস্তু আবদ্ধ হবে, সুতরাং পরিবর্তে আপনার নতুন অবজেক্ট উদ্দীপক, আপনি গ্লোবাল ভেরিয়েবল clobbering করা হবে না। সত্যিই খারাপ। কোনও কম্পাইল সতর্কতা নেই, এবং কোনও রানটাইম সতর্কতা নেই। (পৃষ্ঠা 49)

আরও আছে, তবে আমি আশা করি আপনি ছবিটি পেয়েছেন।

আপনার প্রশ্নের আমার উত্তর: না, এটি ক্ষতিকারক নয়। তবে আপনি যখন এটি ব্যবহার করতে ভুলে যান তবে আপনার কিছু সমস্যা হতে পারে। আপনি যদি একটি ভাল পরিবেশে বিকাশ করে থাকেন তবে আপনি তা লক্ষ্য করুন।

হালনাগাদ

এই উত্তরটি লেখার প্রায় এক বছর পরে ইসিএমএসক্রিপ্টের 5 তম সংস্করণ প্রকাশিত হয়েছিল, কঠোর মোডের জন্য সমর্থন সহ । কঠোর মোডে, thisএখন আর বৈশ্বিক অবজেক্টের সাথে আবদ্ধ নয় undefined


3
আমি পুরোপুরি একমত. সমাধান: ব্যবহারকারীরা কীভাবে আপনার অবজেক্টগুলিকে ইনস্ট্যান্ট করতে হয় তা সর্বদা নথিভুক্ত করুন। একটি উদাহরণ ব্যবহার করুন এবং ব্যবহারকারীরা সম্ভবত কাটা / পেস্ট করবে। প্রতিটি ভাষায় নির্মাণ / বৈশিষ্ট্য রয়েছে যা অস্বাভাবিক / অপ্রত্যাশিত আচরণের ফলে অপব্যবহার করা যায়। এটি তাদের ক্ষতিকারক করে না।
নিকোরোবট

45
একটি সর্বদা একটি বড় হাতের অক্ষর দিয়ে কনস্ট্রাক্টরগুলি শুরু করার জন্য একটি কনভেনশন এবং অন্যান্য ছোট ছোট অক্ষরের অক্ষর যুক্ত ফাংশন রয়েছে।
কিছু

61
আমি কেবল বুঝতে পেরেছি যে ক্রকফোর্ড কখনই ক্ষতিকারক হিসাবে বিবেচনা করবেন না ... আমি জানি না আমি কতক্ষণ একটি ইনফিনিটিভ লুপ তৈরি করেছি কারণ আমি ভেরিয়েবলের বর্ধন করতে ভুলে গেছি ...
কিছু

5
++, - এর জন্য একই। তারা স্পষ্টভাবে সম্ভব ভাষায় আমার উদ্দেশ্য কী তা প্রকাশ করে। আমি ভালবাসি! কিছুটা সুইচ ফলের মাধ্যমে স্পষ্ট হতে পারে তবে আমি সেগুলি সম্পর্কে ক্লান্ত। আমি তাদের ব্যবহার করি যখন তারা স্পষ্টভাবে আরও স্পষ্ট হয় ('শ্লেষকে ঘৃণা করে, প্রতিরোধ করতে পারে না)'।
পিইজেড

30
ক্রকফোর্ডের কাছে আমার উত্তর: প্রোগ্রামিং করা শক্ত, শপিংয়ে যেতে দিন। Sheesh!
জেসন জ্যাকসন

91

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

মৌলিক ভাষার বৈশিষ্ট্যকে এড়িয়ে যাওয়া যেমন newআপনি যে কারণে জগাখিচুড়ি করতে পারেন তা হ'ল মাইনফিল্ডের মধ্য দিয়ে হাঁটার আগে আপনার চকচকে নতুন জুতা সরিয়ে ফেলার মতো আপনি যদি আপনার জুতা ঘোলা হয়ে যেতে পারেন।

আমি একটি কনভেনশন ব্যবহার করি যেখানে ফাংশনের নামগুলি একটি লোয়ার কেস লেটার এবং 'ফাংশন' দিয়ে শুরু হয় যা শ্রেণীর সংজ্ঞা হয় আপার কেস লেটার দিয়ে শুরু হয়। ফলাফলটি আসলেই বেশ জোরালো ভিজ্যুয়াল ক্লু যা 'সিনট্যাক্স' ভুল:

var o = MyClass();  // this is clearly wrong.

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

var o = chair() // Executing chair is daft.
var o = createChair() // makes sense.

এটি আকর্ষণীয় কীভাবে এসও এর সিনট্যাক্স রঙের উপরের কোডটি ব্যাখ্যা করেছে।


8
হ্যাঁ, আমি কেবল সিনট্যাক্স রঙ সম্পর্কে একই জিনিসটি ভাবছিলাম।
ববিশ্যাফটয়ে

4
একবার আমি 'ফাংশন' শব্দটি টাইপ করতে ভুলে গিয়েছিলাম। শব্দটি যে কোনও মূল্যে এড়ানো উচিত। আর একবার আমি কোনও মাল্টি-লাইনে কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করিনি যদি / তারপরে বিবৃতি দেয়। সুতরাং এখন আমি কোঁকড়া ধনুর্বন্ধনী ব্যবহার করি না এবং কেবল এক-লাইন শর্তসাপেক্ষ লিখি।
Hal50000

"এটি স্পষ্টতই ভুল" । কেন? আমার ক্লাসগুলির জন্য (যা কেবলমাত্র করা হয় if (! this instanceof MyClass) return new MyClass()) আমি আসলে new-বিহীন বাক্য গঠনটি পছন্দ করি । কেন? কারণ ফাংশন কনস্ট্রাক্টর ফাংশনের চেয়ে বেশি জেনেরিক । ছেড়ে যাওয়া newকোনও কনস্ট্রাক্টর ফাংশনকে নিয়মিত ফাংশনে পরিবর্তন করা সহজ করে তোলে ... বা অন্য উপায়ে। যুক্ত করা কোডটিকে newযতটা প্রয়োজন তার চেয়ে বেশি নির্দিষ্ট করে তোলে। এবং তাই কম নমনীয়। জাভা এর সাথে তুলনা করুন যেখানে এটির Listপরিবর্তে গ্রহণের প্রস্তাব দেওয়া হয়েছে ArrayListযাতে কলার বাস্তবায়ন বেছে নিতে পারে।
স্টিজন ডি উইট

41

আমি জাভাস্ক্রিপ্টে নবাগত তাই সম্ভবত আমি এটিকে ভাল দৃষ্টিকোণ সরবরাহ করতে খুব বেশি অভিজ্ঞ নই। তবুও আমি এই "নতুন" জিনিসটিতে আমার মতামতটি ভাগ করতে চাই।

আমি সি # বিশ্ব থেকে এসেছি যেখানে "নতুন" মূলশব্দটি ব্যবহার করা এতটাই স্বাভাবিক যে এটি কারখানার নকশা প্যাটার্ন যা আমার কাছে অদ্ভুত লাগে।

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

তারপরে, আমি "নতুন" কীওয়ার্ডটি পেয়েছি যা আমার কাছে এটি "পৃথক" জিনিস। নতুন কীওয়ার্ডের সাহায্যে এটি জিনিস তৈরি করে। নতুন কীওয়ার্ড ব্যতীত, আমি জানি আমি এটি তৈরির সাথে বিভ্রান্ত করব না যতক্ষণ না আমি যে ক্রিয়াকলাপটি চালাচ্ছি তা আমাকে এর দৃ strong় ক্লু দেয় না।

উদাহরণস্বরূপ, var bar=foo();কোন বারটি সম্ভবত সম্ভবত হতে পারে সে সম্পর্কে আমার কোনও ক্লু নেই return এটি কি কোনও ফেরতের মান বা এটি কোনও নতুন নির্মিত বস্তু? তবে var bar = new foo();আমি নিশ্চিত জানি যে বার একটি অবজেক্ট।


3
সম্মত, এবং আমি বিশ্বাস করি কারখানার প্যাটার্নটি মেকফু ()
প্লাকাইলেগন

3
+1 - 'নতুন' এর উপস্থিতি উদ্দেশ্যটির একটি পরিষ্কার বিবৃতি দেয়।
বেলুগাবব

4
এই প্রতিক্রিয়াটি এক ধরণের অদ্ভুত, যখন জেএসের প্রায় প্রতিটি জিনিসই একটি বস্তু। যখন সমস্ত ফাংশন বস্তু হয় তখন আপনাকে কেন নিশ্চিতভাবে জানতে হবে যে কোনও ফাংশন একটি বস্তু?
জোশুয়া রামিরেজ

@JoshuaRamirez বিন্দু নয় typeof new foo() == "object"। এটা তোলে যে newআয় একটি দৃষ্টান্ত foo, এবং আপনি জানেন আপনি কল করতে পারেন foo.bar()এবং foo.bang()। তবে জাসডোকের @ রিটার্ন ব্যবহার করে সহজেই তা হ্রাস করা যায় না যে আমি প্রক্রিয়াগত কোডের পক্ষে কথাটি বলছি (শব্দটি এড়ানো new)
হুয়ান মেন্ডেস

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

39

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

সম্ভাবনা হ'ল ভাষার রক্ষণাবেক্ষণকারীরা তাদের উত্সাহ দেওয়ার চেষ্টা করার মতো প্রতিমাগুলির জন্য ভাষাটি অনুকূলিত করবেন। যদি তারা ভাষায় একটি নতুন কীওয়ার্ড রাখেন তবে তারা সম্ভবত মনে করেন যে কোনও নতুন উদাহরণ তৈরি করার সময় এটি স্পষ্ট হয়ে উঠবে।

ভাষার উদ্দেশ্য অনুসরণ করে লিখিত কোড প্রতিটি প্রকাশের সাথে দক্ষতা বৃদ্ধি করবে। এবং কোডটির মূল ভাষাটির মূল নির্মাণগুলি এড়ানো সময়ের সাথে কষ্ট পাবে।

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


3
পোহ কোডিং লিংকের জন্য +1 - এখন আমার কথোপকথনে
এটির

হাঃ হাঃ হাঃ! আমার সেই বিশেষ ক্ষেত্রে বহু বছরের অভিজ্ঞতা রয়েছে এবং আমি আপনাকে আশ্বাস দিতে পারি যে আপনি কোনও অসুবিধা পাবেন না। তারা প্রায়শই আমাকে রোহউইকি.নেটে পুহ বলে ডাকে। =)
পিইজেড

1
আপনি কখনই এই মন্তব্যটি দেখতে পাবেন কিনা তা জানেন না তবে পোহ কোডিং লিঙ্কটি মারা গেছে।
ক্যালভিন

সতর্ক থাকুন জন্য ধন্যবাদ। আমরা গত সপ্তাহে রোবউকি.নেটকে নতুন উইকিতে স্থানান্তরিত করেছি এবং এই মুহুর্তে পুরানো সামগ্রীটি পৌঁছানো যায় না। আমি সেই পুরানো লিঙ্কগুলি কাজ করে তাড়াতাড়ি করব।
পিইজেড

24

নতুন কীওয়ার্ড ছাড়াই কনস্ট্রাক্টরকে কল করার সমস্যাটি কীভাবে প্রশমিত করা যায় সে সম্পর্কে আমি একটি পোস্ট লিখেছিলাম wrote
এটি বেশিরভাগ ক্ষেত্রে ড্যাডটিক, তবে এটি দেখায় যে আপনি কীভাবে এমন কনস্ট্রাক্টর তৈরি করতে পারেন যা আপনার সাথে বা বাইরে কাজ করে এবং প্রতিটি কনস্ট্রাক্টরের পরীক্ষার জন্য newআপনাকে বয়লারপ্লেট কোড যুক্ত করার প্রয়োজন হয় না this

http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html

কৌশলটির সংক্ষেপটি এখানে:

/**
 * Wraps the passed in constructor so it works with
 * or without the new keyword
 * @param {Function} realCtor The constructor function.
 *    Note that this is going to be wrapped
 *    and should not be used directly 
 */
function ctor(realCtor){
  // This is going to be the actual constructor
  return function wrapperCtor(){
    var obj; // object that will be created
    if (this instanceof wrapperCtor) {
      // Called with new
      obj = this;
    } else {
      // Called without new. Create an empty object of the
      // correct type without running that constructor
      surrogateCtor.prototype = wrapperCtor.prototype;
      obj = new surrogateCtor();
    }
    // Call the real constructor function
    realCtor.apply(obj, arguments);
    return obj;
  }

  function surrogateCtor() {}
}

এটি কীভাবে ব্যবহার করবেন তা এখানে:

// Create our point constructor
Point = ctor(function(x,y){
  this.x = x;
  this.y = y;
});

// This is good
var pt = new Point(20,30);
// This is OK also
var pt2 = Point(20,30);

6
এড়ানো arguments.calleeএ দুর্দান্ত!
গ্রেগ লিন্ড

2
surrogateConstructorsurrogateCtor(বা বিপরীতে) হওয়া উচিত ।
ডেভিড কনরাড

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

1
@ জোয়াকোডার আমি উল্লেখ করেছি যে এটি কেবলমাত্র যুক্তিযুক্ত উদ্দেশ্যেই হয়েছিল, আমি কোডিংয়ের এই প্যারানয়েয়ার স্টাইলে সাবস্ক্রাইব করি না। তবে, আমি যদি একটি ক্লাস লাইব্রেরি লিখছিলাম, তবে হ্যাঁ আমি এই বৈশিষ্ট্যটি এমনভাবে যুক্ত করব যা কলকারীদের কাছে স্বচ্ছ
জুয়ান মেন্ডেস

22

নতুন কীওয়ার্ডটি ব্যবহার না করার পিছনে যুক্তিটি সহজ:

একেবারেই ব্যবহার না করে, আপনি দুর্ঘটনাক্রমে এটিকে বাদ দিয়ে আসা সমস্যাটি এড়াতে পারেন। YUI যে নির্মাণ প্যাটার্নটি ব্যবহার করে তা আপনি কীভাবে সম্পূর্ণ নতুন কীওয়ার্ড এড়াতে পারবেন তার একটি উদাহরণ "

var foo = function () {
    var pub= { };
    return pub;
}
var bar = foo();

বিকল্পভাবে আপনি এটি করতে পারেন:

function foo() { }
var bar = new foo();

তবে এটির মাধ্যমে আপনি কেউ নতুন কীওয়ার্ড ব্যবহার করতে ভুলে যাওয়ার ঝুঁকিপূর্ণ চালান এবং এই অপারেটরটি সমস্ত ফিউবার। এএফআইএকি করার কোনও সুবিধা নেই (আপনি এটির অভ্যস্ত ব্যতীত)।

দিনের শেষে: এটি প্রতিরক্ষামূলক হওয়া সম্পর্কে। আপনি নতুন বিবৃতি ব্যবহার করতে পারেন? হ্যাঁ. এটি কি আপনার কোডকে আরও বিপজ্জনক করে তোলে? হ্যাঁ.

আপনি যদি কখনও সি ++ লিখে থাকেন তবে এটি মুছে ফেলার পরে পয়েন্টারগুলি NUL এ সেট করার অনুরূপ।


6
না। "নতুন foo ()" দিয়ে কিছু বৈশিষ্ট্য নির্ধারকের মতো ফিরে আসা অবজেক্টে সেট করা থাকে।
কিছু

34
সুতরাং, কেবল এটি পরিষ্কার করার জন্য: আপনার "নতুন" ব্যবহার করা উচিত নয় কারণ আপনি এটি ভুলে যেতে পারেন? তুমি মশকরা করছ, ঠিক?
বোম্বে

16
@ বোম্ব: অন্যান্য ভাষায় "নতুন" ভুলে যাওয়ার ফলে একটি ত্রুটি ঘটবে। জাভাস্ক্রিপ্টে, এটি কেবল চালনা চালিয়ে যায়। আপনি ভুলে যেতে পারেন, এবং বুঝতে পারেন না। কেবল erroroneous কোড দিকে তাকিয়ে অভ্যস্ত সব কি ভুল যাচ্ছে এ সুস্পষ্ট হতে।
ক্যান্ট ফ্রেড্রিক

3
@ গ্রেগ: আমি দেখতে পাচ্ছি না যে প্রথম কৌশলটি প্রোটোটাইপ চেইনের ব্যবহারের জন্য কীভাবে অনুমতি দেয় - বস্তুর আক্ষরিকাগুলি দুর্দান্ত, তবে প্রোটোটাইপগুলির দ্বারা প্রদত্ত কার্য সম্পাদন এবং অন্যান্য সুবিধাগুলি ভয়ের বাইরে ফেলে দেওয়া কিছুটা নির্বোধ বলে মনে হয়।
শোগ 9

5
@ বোম্বে - আপনার "নতুন" ব্যবহার করা উচিত কারণ আপনি (এবং যে কেউ আপনার কোড ব্যবহার করেন) কখনও ভুল করবেন না? তুমি মশকরা করছ, ঠিক?
গ্রেগ ডিন

20

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


16

কেস 1: newপ্রয়োজনীয় নয় এবং এড়ানো উচিত

var str = new String('asd');  // type: object
var str = String('asd');      // type: string

var num = new Number(12);     // type: object
var num = Number(12);         // type: number

কেস 2: newপ্রয়োজনীয়, অন্যথায় আপনি একটি ত্রুটি পাবেন

new Date().getFullYear();     // correct, returns the current year, i.e. 2010
Date().getFullYear();         // invalid, returns an error

5
এটি লক্ষ করা উচিত যে 1 এর ক্ষেত্রে, কনস্ট্রাক্টরকে একটি ফাংশন হিসাবে কল করা কেবলমাত্র তখনই বোঝা যায় যখন আপনি টাইপ রূপান্তর করতে চান (এবং হুল অবজেক্টের রূপান্তর পদ্ধতি আছে কিনা তা জানেন না toString())। অন্যান্য সমস্ত ক্ষেত্রে, আক্ষরিক ব্যবহার করুন। না String('asd') , তবে সহজ 'asd', এবং না Number(12) , কিন্তু সহজভাবে 12
নির্ধারিত বছর

1
@ প্রস্তাবিত এই নিয়মের একটি ব্যতিক্রম হ'ল Array: Array(5).fill(0) সম্ভবত স্পষ্টতই বেশি পাঠযোগ্য [undefined, undefined, undefined, undefined, undefined].fill(0)এবং(var arr = []).length = 5; arr.fill(0);
yyny

@YYYOYonnY আমার বক্তব্য উত্তরের 1 কেস এর প্রসঙ্গে তৈরি করা হয়েছে, যা আদিম ধরণের newসাথে সম্পর্কিত বস্তুর জন্য কনস্ট্রাক্টরগুলির ব্যবহার বোঝায় । আপনি যে আক্ষরিক পরামর্শ দিচ্ছেন তা কল ( সমালোচনা) এর সমতুল্য নয় , এবং বাকীটি একটি বাক্য গঠন ত্রুটি :) অন্যথায় আপনি সঠিক, যদিও এটি অবিশ্বাস্য হতে পারে তবে আপনি যদি অ-অনুসারী বাস্তবায়ন বিবেচনা করেন (এবং সুতরাং একটি অনুকরণযুক্ত )। Array0 in …Array(5) Array.prototype.fill(…)
তারিখ

12

newঅপারেটরটি ব্যবহার করার পক্ষে বা বিপক্ষে দুটি শক্তিশালী যুক্তি নিয়ে আমি এখানে সংক্ষিপ্তসারটি করতে পারি :

বিরুদ্ধে তর্ক new

  1. newঅপারেটর ব্যবহার করে অবজেক্ট হিসাবে তাত্ক্ষণিকভাবে নকশাকৃত নকশাকৃত কার্যাদি বিঘ্নজনক প্রভাব ফেলতে পারে যদি তারা ভুলভাবে সাধারণ ফাংশন হিসাবে ডাকা হয়। এই জাতীয় ক্ষেত্রে কোনও ফাংশনের কোড কার্যকরভাবে স্থানীয় বস্তুর স্কোপের পরিবর্তে যেখানে ফাংশন বলা হয় সেখানে কার্যকর করা হবে। এটি বিশ্বব্যাপী ভেরিয়েবল এবং বৈশিষ্ট্যগুলিকে বিপর্যয়কর পরিণতির সাথে ওভাররাইট করাতে পারে।
  2. অবশেষে, লিখন function Func()এবং তারপরে Func.prototype এটিতে স্টাফ যুক্ত করা যাতে আপনি new Func()নিজের অবজেক্টটি তৈরির জন্য কল করতে পারেন এমন কিছু প্রোগ্রামারকে কুরুচিপূর্ণ মনে হয়, যিনি স্থপতি এবং শৈলীগত কারণে অবজেক্টের উত্তরাধিকারের অন্য স্টাইল ব্যবহার করেন।

এই যুক্তি সম্পর্কে আরও তথ্যের জন্য ডগলাস ক্রকফোর্ডের দুর্দান্ত এবং সংক্ষিপ্ত বই জাভাস্ক্রিপ্ট: দ্য গুড পার্টস দেখুন। আসলে যাইহোক এটি পরীক্ষা করে দেখুন।

পক্ষে যুক্তি new

  1. newপ্রোটোটাইপাল অ্যাসাইনমেন্ট সহ অপারেটরটি ব্যবহার করা দ্রুত।
  2. গ্লোবাল নেমস্পেসে কনস্ট্রাক্টর ফাংশনের কোডটি দুর্ঘটনাক্রমে চালানো সম্পর্কে সেই স্টাফগুলি সহজেই প্রতিরোধ করা যেতে পারে যদি আপনি সর্বদা আপনার কনস্ট্রাক্টর ফাংশনে কিছুটা কোড অন্তর্ভুক্ত করেন তবে সেগুলি সঠিকভাবে বলা হচ্ছে কিনা তা যাচাই করার জন্য, এবং যে ক্ষেত্রে তারা না হয় সে ক্ষেত্রে easily , কলটি যথাযথভাবে পরিচালনা করা।

এই কৌশলটির একটি সহজ ব্যাখ্যা এবং তিনি যে উত্তরাধিকারী মডেলটির পক্ষে সমর্থন করেন তার আরও গভীর ব্যাখ্যা জন্য জন রেসিগের পোস্টটি দেখুন ।


উপর আর্গুমেন্ট বিরুদ্ধে আপডেট: # 1 ব্যবহার করে নির্বাপিত করা যায় 'use strict';মোড (অথবা আপনার লিঙ্কে পদ্ধতি) # 2 synatic চিনি আছে ES6 অবশ্য আচরণ আগের মতই আছে।
nNMonkey

9

আমি পেজ এবং এখানে কিছু সাথে একমত।

এটি আমার কাছে স্পষ্ট বলে মনে হয় যে "নতুন" হ'ল স্ব বর্ণনামূলক অবজেক্ট তৈরি, যেখানে ইউইউআই প্যাটার্ন গ্রেগ ডিন বর্ণনা করেছেন তা সম্পূর্ণ অস্পষ্ট

সম্ভাবনা কেউ লিখতে পারে var bar = foo;বা var bar = baz();একটি বস্তু তৈরি পদ্ধতি বলে মনে করা হচ্ছে বায নয় পর্যন্ত বেশী বিপজ্জনক।


8

আমি মনে করি নতুনটি খারাপ, কারণ আপনি ভুল করে এটি ব্যবহার করতে ভুলে গেলে এটি সমস্যার কারণ হতে পারে না কারণ এটি উত্তরাধিকার শৃঙ্খলাটিকে স্ক্রু আপ করে দেয়, যার ফলে ভাষাটি বোঝা আরও কঠিন হয়।

জাভাস্ক্রিপ্ট প্রোটোটাইপ-ভিত্তিক অবজেক্ট-ভিত্তিক। সুতরাং প্রতিটি বস্তু যেমন অন্য একটি বস্তু থেকে তৈরি করা আবশ্যক var newObj=Object.create(oldObj)। এখানে oldObj এর প্রোটোটাইপ বলা হয় newObj (অত: পর "প্রোটোটাইপ-ভিত্তিক")। এটি সূচিত করে যে কোনও সম্পত্তি যদি নতুন ওজেজে পাওয়া না যায় তবে এটি পুরাতনঅবজে অনুসন্ধান করা হবে । ডিফল্টরূপে newObj এইভাবে একটি খালি অবজেক্ট হবে তবে এর প্রোটোটাইপ শৃঙ্খলার কারণে এটি পুরাতনবজের সমস্ত মান রয়েছে বলে মনে হয় ।

অন্যদিকে যদি আপনি না উপর var newObj=new oldObj(), এর প্রোটোটাইপ newObj হয় oldObj.prototype , যা অকারণে বোঝা কঠিন।

কৌশলটি ব্যবহার করা হয় to

Object.create=function(proto){
  var F = function(){};
  F.prototype = proto;
  var instance = new F();
  return instance;
};

এটি এই ফাংশনের অভ্যন্তরে এবং কেবল এখানেই নতুন ব্যবহার করা উচিত। এর পরে কেবল অবজেক্ট.ক্রিট () পদ্ধতিটি ব্যবহার করুন । পদ্ধতিটি প্রোটোটাইপ সমস্যা সমাধান করে।


7
সত্যি কথা বলতে কি, আমি এই কৌশলটি সম্পর্কে বন্য নই - এটি নতুন কিছু যুক্ত করে না, এবং আপনার উত্তরটি বর্ণনা করে যে এটি এমনকি ক্রাচ হতে পারে। আইএমএইচও, জাভাস্ক্রিপ্ট বোঝার জন্য প্রোটোটাইপ চেইন এবং অবজেক্ট ইনস্ট্যান্টেশন বোঝা অত্যন্ত গুরুত্বপূর্ণ ... তবে যদি এটি সরাসরি ব্যবহার করতে আপনার অস্বস্তি বোধ করে তবে কিছু বিশদ যত্ন নেওয়ার জন্য কোনও সহায়ক ফাংশন ব্যবহার করা ভাল, আপনি যতক্ষণ মনে রাখবেন আপনি ততক্ষণ করছেন। এফডাব্লুআইডাব্লু: এটির (কিছুটা আরও কার্যকর) প্রকরণটি ইসমাস্ক্রিপ্টের 5 তম এডের অংশ। কিছু স্ট্যান্ডার্ড এবং কিছু ব্রাউজারে ইতিমধ্যে উপলব্ধ - যাতে আপনার এটি অন্ধভাবে পুনরায় সংজ্ঞায়িত না করা উচিত!
শোগ 9

বিটিডাব্লু: আপনি কেন এই সিডব্লিউ তৈরি করেছেন তা আমি নিশ্চিত নই, তবে আপনি যে ফর্ম্যাটিং সংশোধন করেছি তা দিয়ে আপনি যদি এটি পুনরায় পোস্ট করতে চান তবে এই চেকবক্সটি এড়াতে সতর্ক থাকুন ...
শোগ 9

2
অযথা বোঝা মুশকিল? var c = new Car()করছেন হিসাবে একইvar c = Object.create(Car.prototype); Car.call(c)
হুয়ান মেন্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.