আমরা কেন বিশ্বব্যাপী অবজেক্টের কিছু অন্তর্নির্মিত বৈশিষ্ট্য মুছতে পারি?


12

আমি আজকাল এসপি 5 পড়ছি এবং দেখতে পাচ্ছি যে [[কনফিগারযোগ্য]] গ্লোবাল অবজেক্টের কিছু অন্তর্নির্মিত বৈশিষ্ট্যগুলিতে বৈশিষ্ট্যটি সত্য হিসাবে সেট করা হয়েছে যার অর্থ আমরা এই বৈশিষ্ট্যগুলি মুছতে পারি।

উদাহরণ স্বরূপ:

অ্যারে.প্রোটোটাইপ অবজেক্টের যোগ পদ্ধতিতে বৈশিষ্ট্য রয়েছে

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

সুতরাং আমরা সহজে অ্যারের জন্য যোগদানের পদ্ধতিটি মুছে ফেলতে পারি:

delete Array.prototype.join;
alert([1,2,3].join);

সতর্কতাটি undefinedআমার ক্রোমিয়াম 17, ফায়ারফক্স 9, অর্থাৎ 10, এমনকি 6 পর্যন্ত প্রদর্শিত হবে;

ক্রোম 15 এবং সাফারি 5.1.1 এ [[কনফিগারযোগ্য]] বৈশিষ্ট্যটি সেট করা হয়েছে এবং মুছুন ফলাফলটিও সত্য তবে চূড়ান্ত ফলাফল এখনও রয়েছে function(){[native code]}। দেখে মনে হচ্ছে এটি একটি বাগ এবং ক্রোমিয়াম এটি ঠিক করে।

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


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

উত্তর:


2

আমি আপনার সাথে একমত হতে চাই, কিন্তু অন্যদিকে আমি কেবল ফায়ারফক্স ৩.৩-এdelete JSON.stringify একটি বাগের কারণে নির্দিষ্ট পরিস্থিতিতে আমার একটি পরিস্থিতি খুঁজে পেয়েছি । আমি অবশ্যই সেখানে বানর-প্যাচ বিল্টিনগুলির দক্ষতা দেখে খুশি হয়েছিলাম।


আপনি শুধু এটি ওভাররাইড করবেন না কেন?
ডেমিক্স

2
কারণ পরেরটি যা ঘটে তা হ'ল JSON2.js বোঝা হয়ে যায় যা উপস্থিতি সনাক্ত করে JSON.stringifyএবং প্রয়োজনে এটি সংক্রামিত করে । দুঃখিত, আমি আমার উত্তরে এটি ব্যাখ্যা করিনি।
N3dst4

সুতরাং আপনি JSON2.js এর উত্স কোডও পরিবর্তন করতে পারেন, লোল
ডেমিক্স

তৃতীয় পক্ষের লাইব্রেরিগুলি সংশোধন করা খারাপ ধারণা কারণ আপনি আপনার সমস্ত পরিবর্তনগুলি অনুলিপি না করে সেগুলি আপগ্রেড করতে পারবেন না।
N3dst4

1

কনফিগারযোগ্য মুছে ফেলার বিষয়ে নয়।

এটি কেবল পঠনযোগ্য মানটি প্রতিস্থাপনের ক্ষমতা সম্পর্কে ।

এটি একটি খুব শক্তিশালী সরঞ্জাম এবং অ-কনফিগারযোগ্য মানগুলি হতাশ করছে যদি আপনি সেগুলি মুছতে না পারেন।

আমার বেশ কয়েকটি কেস হয়েছে যেখানে আমার একটি অস্পষ্ট বাগ ঠিক করতে বা কিছুটা ভিন্ন কার্যকারিতা (ইন্টারসেপশন, লগিং) ইনজেক্ট করার প্রয়োজন হয়েছিল। এটি করার জন্য মানটি প্রতিস্থাপনের প্রয়োজন ।

উদাহরণ:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

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

জনগণকে বিরক্ত করার জন্য বৈশিষ্ট্যগুলি অপসারণযোগ্য অন্যগুলি করার কোনও ভাল কারণ নেই।


1
[[লিখনযোগ্য]] বৈশিষ্ট্যটি মান পরিবর্তন করার ক্ষমতা নিয়ন্ত্রণ করে E ইএস 5-তে: [[লিখিত]] বুলিয়ান মিথ্যা হলে, [[পুট]] ব্যবহার করে সম্পত্তির [[মান]] বৈশিষ্ট্যটি পরিবর্তন করার জন্য ইসমাএসক্রিপ্ট কোড দ্বারা প্রচেষ্টা সফল হবে না 
ডেমিক্স

@ ডেমিক্স হ্যাঁ, এটি সঠিক ...
রায়নোস

0

.. ব্যবহারকারীর কোডে অন্তর্নির্মিত ফাংশনগুলি বিপজ্জনক

পুরোপুরি বিপরীত. কাস্টমাইজেশন মঞ্জুরি দেওয়া ভাল কারণ এটি ওয়েবসাইটের লেখকদের আরও নমনীয়তার সুযোগ দেয়।

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

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