নেটিভ অবজেক্টগুলি বাড়ানো কেন একটি খারাপ অভ্যাস?


136

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

নিন টি জে Holowaychuk এর should.js উদাহরণস্বরূপ। তিনি একটি সহজ সংগ্রহকারী যোগ করার Objectএবং সবকিছু ঠিক (কাজ করে সোর্স )।

Object.defineProperty(Object.prototype, 'should', {
  set: function(){},
  get: function(){
    return new Assertion(Object(this).valueOf());
  },
  configurable: true
});

এটি সত্যই উপলব্ধি করে। উদাহরণস্বরূপ এক প্রসারিত হতে পারে Array

Array.defineProperty(Array.prototype, "remove", {
  set: function(){},
  get: function(){
    return removeArrayElement.bind(this);
  }
});
var arr = [0, 1, 2, 3, 4];
arr.remove(3);

দেশীয় ধরণের প্রসারিত করার বিরুদ্ধে কি কোনও যুক্তি রয়েছে?


9
পরে, যখন কোনও নেটিভ অবজেক্টটি আলাদা আলাদা শব্দার্থবিজ্ঞানযুক্ত একটি "অপসারণ" ফাংশনটি আপনার নিজের মধ্যে অন্তর্ভুক্ত করা হয় তখন আপনি কী হওয়ার প্রত্যাশা করবেন? আপনি মান নিয়ন্ত্রণ করেন না।
ta.speot.is

1
এটি আপনার নেটিভ টাইপ নয়। এটি প্রত্যেকের নেটিভ টাইপ।

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

5
কিছু "মতামত নেতাদের" মূল্যবান উদাহরণস্বরূপ ব্রেন্ডন আইচ মনে করেন যে দেশীয় প্রোটোটাইপগুলি প্রসারিত করা এটি পুরোপুরি জরিমানা।
বেনিয়ামিন গ্রুইনবাউম

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

উত্তর:


127

আপনি যখন কোনও বস্তু প্রসারিত করেন, আপনি তার আচরণ পরিবর্তন করেন।

কেবলমাত্র নিজের কোড দ্বারা ব্যবহৃত হবে এমন কোনও সামগ্রীর আচরণ পরিবর্তন করা ভাল। কিন্তু যখন আপনি এমন কোনও আচরণের পরিবর্তন করেন যা অন্য কোডগুলিও ব্যবহার করে সেখানে একটি ঝুঁকি থাকে আপনি সেই অন্যান্য কোডটি ভেঙে ফেলবেন।

যখন জাভাস্ক্রিপ্টে অবজেক্ট এবং অ্যারে ক্লাসগুলিতে পদ্ধতি যুক্ত করা হয় তখন জাভাস্ক্রিপ্ট কীভাবে কাজ করে তার কারণে কিছু ভাঙ্গার ঝুঁকি খুব বেশি is দীর্ঘ বছরের অভিজ্ঞতা আমাকে শিখিয়েছে যে এই ধরণের জিনিসগুলি জাভাস্ক্রিপ্টে সমস্ত ধরণের ভয়ঙ্কর বাগের কারণ হয়।

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

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


2
তাহলে এরকম কিছু যুক্ত করা কি .stgringify()নিরাপদ বলে বিবেচিত হবে?
বুশটোয়েন

7
এখানে প্রচুর সমস্যা রয়েছে, উদাহরণস্বরূপ, যদি অন্য কোনও কোডও তার নিজস্ব stringify()পদ্ধতিটি বিভিন্ন আচরণের সাথে যুক্ত করার চেষ্টা করে তবে কী ঘটে ? এটি প্রতিদিনের প্রোগ্রামিংয়ে আসলেই করা উচিত নয় ... আপনি যা করতে চান তা এখানে এবং সেখানে কোডের কয়েকটি অক্ষর সংরক্ষণ করা নয় if আপনার নিজস্ব শ্রেণি বা ফাংশন সংজ্ঞায়িত করা ভাল যা কোনও ইনপুট গ্রহণ করে এবং স্ট্রিংফাই করে। বেশিরভাগ ব্রাউজারগুলি সংজ্ঞায়িত করে JSON.stringify(), এটি উপস্থিত রয়েছে কিনা তা নিজেরাই নির্ধারণ না করা ভাল।
অভি বেকার্ট

5
আমি পছন্দ someError.stringify()উপর errors.stringify(someError)। এটি সোজা এবং জেএসের ধারণার সাথে পুরোপুরি স্যুট। আমি এমন কিছু করছি যা নির্দিষ্ট ত্রুটিযুক্ত অবজেক্টের কাছে বিশেষভাবে আবদ্ধ।
বুশটোয়েন

1
কেবলমাত্র (তবে ভাল) যুক্তিটি হ'ল, কিছু মজাদার ম্যাক্রো-লিবস আপনার ধরণের উপরের অংশ নিতে শুরু করতে পারে এবং একে অপরের সাথে হস্তক্ষেপ করতে পারে। নাকি অন্য কিছু আছে?
বুশটোয়েন

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

32

পারফরম্যান্স হিটের মতো কোনও পরিমাপযোগ্য কমতি নেই। কমপক্ষে কেউ কোনও উল্লেখ করেনি। সুতরাং এটি ব্যক্তিগত পছন্দ এবং অভিজ্ঞতার একটি প্রশ্ন।

মূল সমর্থক যুক্তি: এটি আরও ভাল দেখায় এবং আরও স্বজ্ঞাত: সিনট্যাক্স চিনি। এটি একটি প্রকার / উদাহরণ সুনির্দিষ্ট ফাংশন, সুতরাং এটি নির্দিষ্টভাবে / টাইপের সাথে আবদ্ধ হওয়া উচিত।

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

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

এবং এই কারণেই আমি jQuery, আন্ডারস্কোর ইত্যাদির মতো libs অপছন্দ করি me তারা একেবারে সু-প্রোগ্রামড এবং এগুলি কবজির মতো কাজ করে তবে তারা বড় । আপনি তাদের মধ্যে কেবল 10% ব্যবহার করেন এবং প্রায় 1% বোঝেন।

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

টিএল; ডিআর সন্দেহ হলে, দেশীয় প্রকারগুলি প্রসারিত করবেন না। আপনি যদি 100% নিশ্চিত হন তবে কেবলমাত্র একটি দেশীয় প্রকার প্রসারিত করুন, শেষ ব্যবহারকারীটি সেই আচরণ সম্পর্কে জানতে ও জানতে চাইবে। ইন কোন ক্ষেত্রে একটি নেটিভ টাইপ বর্তমান ফাংশন নিপূণভাবে, যেমন বিদ্যমান ইন্টারফেস ভঙ্গ করবে।

আপনি যদি প্রকারটি প্রসারিত করার সিদ্ধান্ত নেন তবে ব্যবহার করুন Object.defineProperty(obj, prop, desc); যদি আপনি না পারেন তবে টাইপটি ব্যবহার করুন prototype


আমি মূলত এই প্রশ্নটি নিয়ে এসেছি কারণ আমি চেয়েছিলাম Errorযে জেএসএন এর মাধ্যমে প্রেরণযোগ্য হবে। সুতরাং, আমি তাদের স্ট্রিংফাই করার একটি উপায় প্রয়োজন। error.stringify()চেয়ে ভাল উপায় অনুভূত errorlib.stringify(error); দ্বিতীয় কনস্ট্রাক্ট অনুসারে, আমি নিজে চালাচ্ছি errorlibএবং errorনিজেই চলছি না ।


আমি এ সম্পর্কে আরও মতামত খোলা।
বুশটোয়েনস 4:

4
আপনি কি সেই jQuery বোঝাচ্ছেন এবং নেটিভ অবজেক্টের আন্ডারস্কোরটি প্রসারিত করছেন? তারা না। সুতরাং যদি আপনি সে কারণে এগুলি এড়াচ্ছেন তবে আপনি ভুল করছেন।
JLRishe

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

2
@ ম্যাকাহাব্লু - একটি লাইব্রেরি কেবলমাত্র তার নিজস্ব অভ্যন্তরীণ প্রোগ্রামিংয়ের সুবিধার জন্য একটি স্ট্যান্ডার্ড অবজেক্টটি সংশোধন করার সিদ্ধান্ত নিতে পারে (এজন্য লোকেরা প্রায়শই এটি করতে চায়)। সুতরাং, এই দ্বন্দ্বটি এড়ানো যায় না কারণ আপনি একই ফাংশনযুক্ত দুটি গ্রন্থাগার ব্যবহার করবেন না।
jفر00

1
আপনি (es2015 হিসাবে) একটি নতুন শ্রেণি তৈরি করতে পারেন যা বিদ্যমান বর্গকে প্রসারিত করে এবং এটি নিজের কোডে ব্যবহার করতে পারে। সুতরাং MyError extends Errorএটি যদি stringifyঅন্য সাবক্লাসের সাথে সংঘর্ষ না করেই কোনও পদ্ধতি থাকতে পারে । আপনাকে এখনও নিজের কোড দ্বারা উত্পাদিত না হওয়া ত্রুটিগুলি পরিচালনা করতে হবে, তাই এটি Errorঅন্যের তুলনায় কম কার্যকর হতে পারে ।
শাদ স্টার্লিং

16

আমার মতে, এটি একটি খারাপ অভ্যাস। প্রধান কারণ হ'ল সংহতকরণ। Should.js ডক্স উদ্ধৃত করা:

ওএমজি এটি ওবিজেট বাড়ায় ???!?! @ হ্যাঁ, হ্যাঁ, এটি একটি সিঙ্গেল গেটারের সাথে করা উচিত, এবং না এটি আপনার কোড ভঙ্গ করবে না

আচ্ছা, লেখক কীভাবে জানতে পারবেন? আমার বিদ্রূপ কাঠামো যদি একই রকম হয় তবে কী হবে? আমার প্রতিশ্রুতিগুলি যদি একই কাজ করে তবে কী হবে?

আপনি যদি এটি নিজের প্রকল্পে করছেন তবে ঠিক আছে। তবে একটি লাইব্রেরির জন্য, তবে এটি একটি খারাপ নকশা। অ্যান্ডস্কোর.জেএস সঠিকভাবে করা জিনিসটির একটি উদাহরণ:

var arr = [];
_(arr).flatten()
// or: _.flatten(arr)
// NOT: arr.flatten()

2
আমি নিশ্চিত যে এই প্রতিশ্রুতি বা ঠাট্টা কাঠামো ব্যবহার না করার জন্য টিজির প্রতিক্রিয়া হবে: x
জিম শুবার্ট

_(arr).flatten()উদাহরণস্বরূপ আসলে নেটিভ বস্তু প্রসারিত করতে আমাকে বিশ্বাস। আমার ব্যক্তিগত কারণটি নিখুঁত বাক্য গঠনমূলক ছিল। তবে এটি আমার নান্দনিক অনুভূতিটি সন্তুষ্ট করে :) এমনকি আরও কিছু নিয়মিত ফাংশন নাম ব্যবহার করে foo(native).coolStuff()এটিকে কিছু "বর্ধিত" অবজেক্টে রূপান্তর করতে চাই সিনট্যাক্টিক্যালি দুর্দান্ত লাগে। সুতরাং যে জন্য ধন্যবাদ!
উদ্বিগ্ন

16

যদি আপনি কেস ভিত্তিতে কোনও কেসটিকে লক্ষ্য করেন তবে সম্ভবত কিছু বাস্তবায়ন গ্রহণযোগ্য।

String.prototype.slice = function slice( me ){
  return me;
}; // Definite risk.

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

String.prototype.capitalize = function capitalize(){
  return this.charAt(0).toUpperCase() + this.slice(1);
}; // A little less risk.

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

অন্যান্য লাইব্রেরির সাথে সংঘর্ষিত হতে পারে এমন নাম যুক্ত করার পরিবর্তে, আপনি কোনও সংস্থা / অ্যাপ্লিকেশন নির্দিষ্ট সংশোধক ব্যবহার করেছেন যা সমস্ত দেব বুঝতে পারে?

String.prototype.weCapitalize = function weCapitalize(){
  return this.charAt(0).toUpperCase() + this.slice(1);
}; // marginal risk.

var myString = "hello to you.";
myString.weCapitalize();
// => Hello to you.

আপনি অন্যান্য বস্তু প্রসারিত অব্যাহত থাকে, তাহলে সব devs সঙ্গে বন্য (এই ক্ষেত্রে) তাদের সম্মুখীন হবে আমরা যা তাদেরকে অবহিত করবে যে এটি একটি কোম্পানী / অ্যাপ্লিকেশান নির্দিষ্ট এক্সটেনশন ছিল।

এটি নামের সংঘর্ষগুলি দূর করে না, তবে সম্ভাবনা হ্রাস করে। যদি আপনি নির্ধারণ করেন যে মূল জেএস বিষয়বস্তুগুলি আপনার এবং / অথবা আপনার দলের পক্ষে, সম্ভবত এটি আপনার পক্ষে।


7

বিল্ট-ইনগুলির প্রোটোটাইপগুলি প্রসারিত করা আসলেই একটি খারাপ ধারণা। তবে, ES2015 একটি নতুন কৌশল চালু করেছে যা পছন্দসই আচরণটি পেতে ব্যবহার করা যেতে পারে:

WeakMapঅন্তর্নির্মিত প্রোটোটাইপগুলির সাথে প্রকারগুলি সংযুক্ত করতে ব্যবহার করতে

নিম্নলিখিত বাস্তবায়ন প্রসারিত Numberএবং Arrayএগুলির নমুনা তাদের সকলের দিকে স্পর্শ ছাড়া:

// new types

const AddMonoid = {
  empty: () => 0,
  concat: (x, y) => x + y,
};

const ArrayMonoid = {
  empty: () => [],
  concat: (acc, x) => acc.concat(x),
};

const ArrayFold = {
  reduce: xs => xs.reduce(
   type(xs[0]).monoid.concat,
   type(xs[0]).monoid.empty()
)};


// the WeakMap that associates types to prototpyes

types = new WeakMap();

types.set(Number.prototype, {
  monoid: AddMonoid
});

types.set(Array.prototype, {
  monoid: ArrayMonoid,
  fold: ArrayFold
});


// auxiliary helpers to apply functions of the extended prototypes

const genericType = map => o => map.get(o.constructor.prototype);
const type = genericType(types);


// mock data

xs = [1,2,3,4,5];
ys = [[1],[2],[3],[4],[5]];


// and run

console.log("reducing an Array of Numbers:", ArrayFold.reduce(xs) );
console.log("reducing an Array of Arrays:", ArrayFold.reduce(ys) );
console.log("built-ins are unmodified:", Array.prototype.empty);

আপনি দেখতে পারেন এমনকি এমনকি এই কৌশলটি দ্বারা আদিম প্রোটোটাইপগুলি বাড়ানো যেতে পারে। Objectঅন্তর্নির্মিত প্রোটোটাইপগুলির সাথে প্রকারগুলি সংযুক্ত করতে এটি একটি মানচিত্রের কাঠামো এবং পরিচয় ব্যবহার করে ।

আমার উদাহরণটি reduceএমন একটি ফাংশন সক্ষম করে যা কেবলমাত্র Arrayতার একক যুক্তি হিসাবে প্রত্যাশা করে , কারণ এটি কীভাবে খালি সঞ্চালক তৈরি করতে পারে এবং কীভাবে অ্যারের উপাদান থেকে এই সংগ্রহকারীর সাথে উপাদানগুলি সংযুক্ত করতে পারে তা তথ্য বের করতে পারে।

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


এটি উইকম্যাপের দুর্দান্ত ব্যবহার। xs[0]খালি অ্যারেতে এটির সাথে সতর্কতা অবলম্বন করুন। type(undefined).monoid ...
আপনাকে ধন্যবাদ

@ নোমিক আমি জানি - আমার সর্বশেষ প্রশ্নটি ২ য় কোড স্নিপেট দেখুন।

এই @ ফুটার জন্য সমর্থন কীভাবে?
onassar

5
-1; এটার কারও কি লাভ? আপনি কেবল পদ্ধতিগুলিতে একটি পৃথক গ্লোবাল অভিধান ম্যাপিংয়ের ধরন তৈরি করছেন এবং তারপরে স্পষ্টভাবে টাইপ অনুসারে সেই অভিধানে পদ্ধতিগুলি সন্ধান করছেন। ফলস্বরূপ, আপনি উত্তরাধিকারের জন্য সমর্থন হারাবেন (কোনও পদ্ধতিতে "যুক্ত করা যায়" এটির জন্য Object.prototypeআহ্বান করা যায় না Array) এবং সিনট্যাক্সটি যদি আপনি প্রকৃতপক্ষে প্রোটোটাইপটি প্রসারিত করেন তবে তার চেয়ে যথেষ্ট দীর্ঘ / কুরুচিপূর্ণ হয়। স্থির পদ্ধতি সহ কেবল ইউটিলিটি ক্লাস তৈরি করা প্রায় সর্বদা সহজ হবে; এই পদ্ধতির একমাত্র সুবিধাটি হল পলিমারফিজমের জন্য কিছু সীমিত সমর্থন।
মার্ক

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

7

আপনার দেশীয় অবজেক্টগুলি বাড়ানো না যাওয়ার আরও একটি কারণ :

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

আমরা আমাদের পৃষ্ঠাগুলির একটিতে ওয়েবকোম্পোনেন্টগুলি প্রবর্তন করেছি, তাই ওয়েবকম্পোন্টস-লাইট.জেগুলি সম্পূর্ণ (নেটিভ) ইভেন্ট অবজেক্ট আইই (কেন?) এ প্রতিস্থাপন করার সিদ্ধান্ত নিয়েছে। এটি অবশ্যই প্রোটোটাইপ.জেএসকে ভেঙে দেয় যা ফলস্বরূপ ম্যাজেন্টোকে ভেঙে দেয়। (যতক্ষণ না আপনি সমস্যাটি খুঁজে পান ততক্ষণ আপনি এটিকে পিছনে ফেলে অনেক ঘন্টা বিনিয়োগ করতে পারেন)

আপনি যদি কষ্ট পছন্দ করেন তবে এটি চালিয়ে যান!


4

আমি এটি না করার জন্য তিনটি কারণ দেখতে পাচ্ছি (একটি আবেদনের মধ্যে থেকে অন্তত), যার মধ্যে দুটি মাত্র এখানে বিদ্যমান উত্তরে সম্বোধন করা হয়েছে:

  1. যদি আপনি এটি ভুল করে থাকেন তবে আপনি দুর্ঘটনাক্রমে প্রসারিত ধরণের সমস্ত অবজেক্টে একটি অগণিত সম্পত্তি যুক্ত করবেন। সহজেই ব্যবহার করে প্রায় কাজ করে Object.definePropertyযা ডিফল্টরূপে অগণনীয় বৈশিষ্ট্য তৈরি করে।
  2. আপনি যে লাইব্রেরিটি ব্যবহার করছেন তা আপনার দ্বন্দ্বের কারণ হতে পারে। পরিশ্রম দিয়ে এড়ানো যায়; প্রোটোটাইপে কিছু যুক্ত করার আগে আপনি যে লাইব্রেরিগুলি সংজ্ঞায়িত করেন সেগুলি পরীক্ষা করুন, আপগ্রেড করার সময় রিলিজ নোটগুলি পরীক্ষা করুন এবং আপনার অ্যাপ্লিকেশনটি পরীক্ষা করুন।
  3. আপনি স্থানীয় জাভাস্ক্রিপ্ট পরিবেশের ভবিষ্যতের সংস্করণের সাথে দ্বন্দ্বের কারণ হতে পারেন।

পয়েন্ট 3 তর্কযুক্তভাবে সবচেয়ে গুরুত্বপূর্ণ এক। আপনি পরীক্ষার মাধ্যমে নিশ্চিত করতে পারেন যে আপনার প্রোটোটাইপ এক্সটেনশনগুলি আপনার ব্যবহৃত লাইব্রেরিগুলির সাথে কোনও দ্বন্দ্ব সৃষ্টি করে না, কারণ আপনি সিদ্ধান্ত নেন যে আপনি কোন লাইব্রেরি ব্যবহার করেন। আপনার কোডটি একটি ব্রাউজারে চলে তা ধরে নিলে দেশীয় অবজেক্টগুলির ক্ষেত্রেও এটি একই নয়। আপনি যদি Array.prototype.swizzle(foo, bar)আজকে সংজ্ঞায়িত করেন এবং আগামীকাল গুগল Array.prototype.swizzle(bar, foo)ক্রোমে যুক্ত হয় তবে আপনি কিছু বিভ্রান্ত সহকর্মীর সাথে সমাপ্ত হতে দায়বদ্ধ, যারা অবাক হন যে কেন .swizzleআচরণটি এমডিএন-তে নথিভুক্ত রয়েছে তার সাথে মেলে না বলে মনে হয়।

( প্রোটোটাইপগুলির সাথে মটুলগুলি কীভাবে ঝাঁকুনির গল্প পড়ে তা ওয়েবে ব্রেক এড়ানোর জন্য কোনও ES6 পদ্ধতিটির নাম পরিবর্তন করতে বাধ্য করা হয়েছিল ))

নেটিভ অবজেক্টগুলিতে (যেমন Array.prototype.myappSwizzleপরিবর্তে সংজ্ঞায়িত Array.prototype.swizzle) পদ্ধতির জন্য অ্যাপ্লিকেশন-নির্দিষ্ট উপসর্গটি ব্যবহার করে এটি এড়ানো যায় তবে এ জাতীয় কদর্য; প্রোটোটাইপগুলিকে বাড়ানোর পরিবর্তে স্বতন্ত্র ইউটিলিটি ফাংশনগুলি ব্যবহার করে এটি ঠিক তত ভাল সমাধানযোগ্য।


2

পারফ একটি কারণ। কখনও কখনও আপনার কীগুলি লুপ করতে হবে। এই কাজ করার বিভিন্ন উপায় আছে

for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }

আমি সাধারণত for of Object.keys()এটি ব্যবহার করি কারণ এটি সঠিক কাজ করে এবং তুলনামূলকভাবে নিবিষ্ট, চেক যুক্ত করার দরকার নেই।

তবে, এটি অনেক ধীর

for-of পারফেক্ট ফলাফলের জন্য

কেবল কারণটি Object.keysধীর বলে অনুমান করা সুস্পষ্ট, Object.keys()একটি বরাদ্দ দিতে হবে। আসলে এএফএআইকে এর পর থেকে সমস্ত কীগুলির একটি অনুলিপি বরাদ্দ করতে হয়।

  const before = Object.keys(object);
  object.newProp = true;
  const after = Object.keys(object);

  before.join('') !== after.join('')

এটি সম্ভবত জেএস ইঞ্জিনটি এক প্রকার অপরিবর্তনীয় কী কাঠামো ব্যবহার করতে পারে যাতে এমন Object.keys(object)একটি রেফারেন্স ফিরে আসে যা অপরিবর্তনীয় কীগুলির উপর পুনরুক্তি করে এবং এটি object.newPropসম্পূর্ণ নতুন অপরিবর্তনীয় কী বস্তু তৈরি করে তবে যাই হোক না কেন, এটি 15x পর্যন্ত স্পষ্টভাবে ধীর

এমনকি চেকিং hasOwnProperty2x পর্যন্ত ধীর হয়।

এগুলির সমস্ত বিষয় হ'ল যদি আপনার পারফেক্ট সংবেদনশীল কোড থাকে এবং কীগুলির উপর দিয়ে লুপ করতে হয় তবে আপনি for inকল না করেই ব্যবহার করতে সক্ষম হতে চান hasOwnProperty। আপনি যদি পরিবর্তন না করেন তবে আপনি এটি করতে পারেনObject.prototype

নোট করুন যে আপনি যদি Object.definePropertyপ্রোটোটাইপটি সংশোধন করতে ব্যবহার করেন তবে যদি আপনি যুক্ত জিনিসগুলি অঙ্কনীয় না হয় তবে তারা উপরের ক্ষেত্রে জাভাস্ক্রিপ্টের আচরণকে প্রভাবিত করবে না। দুর্ভাগ্যক্রমে, কমপক্ষে Chrome 83 এ তারা কার্য সম্পাদনকে প্রভাবিত করে।

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

আমি যে কোনও পারফেক্ট ইস্যুগুলিকে প্রদর্শিত হতে বাধ্য করার চেষ্টা করার জন্য 3000 অ-গণনাযোগ্য বৈশিষ্ট্য যুক্ত করেছি। শুধুমাত্র 30 টি বৈশিষ্ট্যযুক্ত পরীক্ষাগুলি খুব পারফেক্ট প্রভাব আছে কিনা তা বলার অপেক্ষা রাখে না।

https://jsperf.com/does-adding-non-enumerable-properties-affect-perf

ফায়ারফক্স 77 77 এবং সাফারি ১৩.১ অগমেন্টেড এবং অযৌক্তিক ক্লাসগুলির মধ্যে পারফেক্টের মধ্যে কোনও পার্থক্য দেখায়নি সম্ভবত v8 এই অঞ্চলে স্থির হয়ে উঠবে এবং আপনি পারফেক্ট সমস্যাগুলি উপেক্ষা করতে পারেন।

তবে, আমার গল্পটিও যুক্ত করুনArray.prototype.smoosh । সংক্ষিপ্ত সংস্করণটি মটুলস, একটি জনপ্রিয় লাইব্রেরি, তাদের নিজস্ব তৈরি করেছে Array.prototype.flatten। স্ট্যান্ডার্ড কমিটি একটি নেটিভ যুক্ত করার চেষ্টা করলে Array.prototype.flattenতারা প্রচুর সাইট না ভাঙতে পারত। এই ডিভস যারা বিরতির বিষয়ে জানতে পেরেছিল তারা এস 5 পদ্ধতিটির নাম smooshকৌতুক হিসাবে রাখার পরামর্শ দিয়েছিল তবে লোকেরা বুঝতে পারে না যে এটি একটি রসিকতা ছিল। তারা flatপরিবর্তে স্থিরflatten

গল্পটির নৈতিকতা হ'ল আপনার দেশীয় জিনিসগুলি প্রসারিত করা উচিত নয়। আপনি যদি নিজের জিনিসপত্র ভাঙার একই সমস্যার সমাধান করতে পারেন এবং আপনার নির্দিষ্ট গ্রন্থাগারটি MooTools এর মতো জনপ্রিয় না হয়ে থাকে তবে ব্রাউজার বিক্রেতারা আপনার যে সমস্যাটি করেছেন তার চারপাশে কাজ করার সম্ভাবনা কম। আপনার লাইব্রেরিটি যদি এটি জনপ্রিয় হয়ে ওঠে তবে আপনি যে সমস্যাটি করেছেন তা ঘিরে সবাইকে কাজ করতে বাধ্য করা একরকম অর্থ হবে। সুতরাং, দয়া করে নেটিভ অবজেক্টগুলি প্রসারিত করবেন না


অপেক্ষা করুন, hasOwnPropertyসম্পত্তিটি অবজেক্টে বা প্রোটোটাইপে রয়েছে কিনা তা আপনাকে বলে। তবে for inলুপটি আপনাকে কেবল অগণিত বৈশিষ্ট্যই দেয়। আমি কেবল এটি ব্যবহার করে দেখেছি: অ্যারে প্রোটোটাইপে একটি অ-গুণযোগ্য সম্পত্তি যুক্ত করুন এবং এটি লুপে প্রদর্শিত হবে না। কোন প্রয়োজন নেই না কাজ সবচেয়ে সহজ লুপ জন্য প্রোটোটাইপ পরিবর্তন করতে।
ygoe

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