হিম এবং সীল মধ্যে পার্থক্য


164

আমি কেবল জাভাস্ক্রিপ্ট পদ্ধতি সম্পর্কে শুনেছি freezeএবং sealযা কোনও অবজেক্টকে অনিবার্য করতে ব্যবহৃত হতে পারে।

এটি কীভাবে ব্যবহার করবেন তা এখানে একটি ছোট উদাহরণ:

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"

মধ্যে পার্থক্য কি freezeএবং seal? তারা পারফরম্যান্স বাড়াতে পারেন?


6
এই প্রশ্নটি দেখার জন্য যে কারও কাছে কেবল একটি নোট, গৃহীত উত্তরটি সত্যই ভুল। @ টুংড এর উত্তর সঠিক।
বিয়ন্সের

2
আরেকটি নোট, এর রয়েছে Object.preventExtensionsছাড়াও Object.sealএবং Object.freezeObject.preventExtensionsনতুন আইটেমগুলিকে কেবল কোনও বস্তুতে যুক্ত হওয়া থেকে বাধা দেয়। আপনি যে বস্তুর এক্সটেনসিবিলিটি বন্ধ করে দিয়েছিলেন সেগুলির বৈশিষ্ট্যগুলির মানগুলি মুছতে, কনফিগার করতে এবং পরিবর্তন করতে পারেন Object.preventExtensions
বিয়ন্সের

উত্তর:


193

Object.seal

  • এটি সিল করা বস্তু থেকে বৈশিষ্ট্যগুলি যুক্ত এবং / বা অপসারণ প্রতিরোধ করে; ব্যবহার deleteমিথ্যা ফিরে আসবে
  • এটি প্রতিটি বিদ্যমান সম্পত্তি অ-কনফিগারযোগ্য করে তোলে : এগুলি 'ডেটা বর্ণনাকারী' থেকে 'অ্যাকসেসর বর্ণনাকারী' (এবং তদ্বিপরীত) তে রূপান্তর করা যায় না এবং অ্যাক্সেসর বর্ণনাকারীর কোনও বৈশিষ্ট্যই মোটেও সংশোধন করা যায় না (যেখানে ডেটা বর্ণনাকারীরা তাদের writableবৈশিষ্ট্য পরিবর্তন করতে পারে এবং সত্য valueযদি তাদের গুণাবলী writeable)।
  • TypeErrorসিল করা বস্তুর নিজেই মূল্য পরিবর্তন করার চেষ্টা করার সময় একটি নিক্ষেপ করতে পারে (বেশিরভাগ কড়া মোডে )

Object.freeze

  • ঠিক কী Object.sealকরে, প্লাস:
  • এটি কোনও বিদ্যমান বৈশিষ্ট্য পরিবর্তন করতে বাধা দেয়

কেউই 'গভীর' / নাতি নাতনিদেরকে প্রভাবিত করে না। উদাহরণস্বরূপ, যদি objহিমায়িত obj.elহয় তবে পুনরায় নিয়োগ দেওয়া যাবে না, তবে এর মান obj.elপরিবর্তন করা যেতে পারে, উদাহরণস্বরূপ obj.el.idপরিবর্তন করা যেতে পারে।


কর্মক্ষমতা:

ব্রাউজারের উপর নির্ভর করে কোনও বস্তুকে সিলিং বা হিম করা তার গণনার গতিতে প্রভাব ফেলতে পারে:

  • ফায়ারফক্স: গণনার কার্যকারিতা প্রভাবিত হয় না
  • আইই: গণনার পারফরম্যান্সের প্রভাবটি নগণ্য
  • ক্রোম: সিল করা বা হিমায়িত জিনিসগুলির সাথে গণনার কর্মক্ষমতা দ্রুত
  • সাফারি: সিল করা বা হিমায়িত অবজেক্টগুলি গণনা করে 92% ধীর গতিতে (2014 হিসাবে)

পরীক্ষা: সিলযুক্ত বস্তু , হিমায়িত অবজেক্ট


2
আমরা কেন এই পদ্ধতিগুলি ব্যবহার করব তা নিয়ে আপনি কথা বলতে পারেন? আমরা কি পারব?
অ্যালান ডং

3
ভবিষ্যতে আমি মনে করি কোনও লাইব্রেরি / কাঠামো তৈরি করার সময় এগুলি প্রচুর ব্যবহৃত হবে (সঠিকভাবে অনুকূলিত হলে)। তারা আপনাকে ব্যবহারকারীর (এমনকি অনিচ্ছাকৃতভাবে) আপনার কোডটি ভেঙে ফেলার অনুমতি দেয় (এবং উত্তর হিসাবে বলা হয়েছে, অপ্টিমাইজেশানগুলি দুর্দান্ত গতির উন্নতির দিকে পরিচালিত করতে পারে)। তবে এটি খাঁটি জল্পনা :)
নিককোলি ক্যাম্পলুনগো

2
এই উত্তরে অনেকগুলি ত্রুটিযুক্ত ত্রুটি রয়েছে। একটির জন্য, sealবিদ্যমান বৈশিষ্ট্যগুলি অ-কনফিগারযোগ্যও করে তোলে, jsfiddle.net/btipling/6m743 দেখুন সংখ্যা 2, আপনি এখনও সম্পাদনা করতে পারেন, এটি সিল করা বস্তুর বিদ্যমান বৈশিষ্ট্যের মান পরিবর্তন করতে পারে।
বিয়ন্সের

8
এফডাব্লুআইডাব্লু, হিমশীতল এবং সিল করা বস্তুগুলি ক্রোম ক্যানারি v43.0.2317.0 এ তাদের নিথর এবং অপরিশোধিত অংশগুলির তুলনায় এখন দ্রুত।
llambda

2
@ অ্যালানডং আসতে কিছুটা দেরি করেছে, তবে এখানে আপনি কেন কোনও অবজেক্ট লক করতে চান Java জাভাস্ক্রিপ্টের বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল আপনি যে কোনও সময় নিজের পছন্দমতো সম্পত্তি যুক্ত করতে পারেন; আপনি ভুল টাইপ করে এটি দুর্ঘটনাক্রমেও করতে পারেন । আমার অনেক শিক্ষার্থী কল করা onClickবা ইভেন্ট হ্যান্ডলার যুক্ত করার চেষ্টা করেছে বা onlickভাবছে কেন এটি কাজ করছে না। যদি জাভাস্ক্রিপ্ট কোনও ত্রুটি ছুড়ে ফেলে, তবে ভুল হওয়াতে এটি একটি কম জিনিস। দ্বিতীয়ত, এটি আপনাকে এমন কোনও জিনিসে ধ্রুবক বৈশিষ্ট্য প্রয়োগ করতে দেয় যা পরিবর্তনগুলি প্রতিরোধ করে। এটি বস্তু মেথজডগুলিতে বিশেষভাবে কার্যকর।
মানংগো

119

আমি একটি পরীক্ষা প্রকল্প লিখেছিলাম যা এই 3 টি পদ্ধতির সাথে তুলনা করে:

  • Object.freeze()
  • Object.seal()
  • Object.preventExtensions()

আমার ইউনিট পরীক্ষাগুলি সিআরইউডি কেসগুলি কভার করে:

  • [সি] নতুন সম্পত্তি যুক্ত করুন
  • [আর] বিদ্যমান সম্পত্তি পড়ুন
  • [ইউ] বিদ্যমান সম্পত্তি পরিবর্তন করুন
  • [ডি] বিদ্যমান সম্পত্তি অপসারণ

ফলাফল:

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


2
এটা অসাধারণ. আপডেট আপডেট বিবরণী বৈশিষ্ট্য যেমন কনফিগারযোগ্য, গণনাযোগ্য, লেখার যোগ্য (সংজ্ঞায়িতপ্রাপ্তির মাধ্যমে) অ্যাকাউন্টে গ্রহণ করে?
ড্রেনাই

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

@ মানঙ্গো আপনি নিজের ডোম অবজেক্টগুলিকে সিল করতে পারবেন। কেবল একটি DEBUGMODEপরিবর্তনশীল তৈরি করুন এবং এটি সেট করুন true। তারপর, না if (DEBUGMODE) { ... }। ইন ...নিশ্চিত সব DOM বস্তু সবসময় নামমুদ্রাম্কিত জন্য আপনার কার্যকারিতা করা। তারপরে, আপনি যখন নিজের ওয়েবপৃষ্ঠার স্ক্রিপ্ট বিতরণ করতে প্রস্তুত হন, তখন পরিবর্তিত DEBUGMODEহয়ে falseক্লোজার সংকলকটির মাধ্যমে আপনার স্ক্রিপ্টটি চালান এবং বিতরণ করুন। এটা ঐটার মতই সহজ.
জ্যাক গিফিন

@ জ্যাকগিফিন মন্তব্য করার জন্য ধন্যবাদ। আমি কেবল বলছিলাম যে আমি সবসময় ভাবতাম এটি একটি ভাল ধারণা হবে। আমার প্রচুর শিক্ষার্থী রয়েছে যারা এমন কিছু টাইপ করে element.onlick=somethingহতাশ হয়ে পড়ে কারণ এটি কাজ করে না, তবে এটি প্রযুক্তিগতভাবে কোনও ত্রুটি নয়।
ম্যাঙ্গো

2
@ নিঃসঙ্গত তাহলে এটি CRUD বানান করবে না। আপনাকে রুডের মতো কিছু স্থির করতে হবে;)
মঙ্গো

84

আপনি সর্বদা এমডিএন এ দেখতে পারেন। সংক্ষেপে:

  • হিমায়িত : অবজেক্টটিকে স্থাবর করে তোলে যার অর্থ সংজ্ঞায়িত সম্পত্তিতে কোনও পরিবর্তন অনুমোদিত নয়, যদি না তারা বস্তু হয়।
  • সীল : বৈশিষ্ট্য সংযোজন রোধ করুন, তবে সংজ্ঞায়িত বৈশিষ্ট্যগুলি এখনও পরিবর্তন করা যেতে পারে।

1
Object.seal()প্রোটোটাইপ বৈশিষ্ট্যগুলি হিমায়িত করা হয় বলে মনে হয় : \
কে .. 20

10

Object.freeze()হিমশীতল বস্তু তৈরি করে যার অর্থ এটি একটি বিদ্যমান অবজেক্ট গ্রহণ করে এবং মূলত Object.seal()এটিতে কল করে তবে এটি সমস্ত "ডেটা অ্যাক্সেসর" বৈশিষ্ট্য হিসাবে চিহ্নিত করে writable:false, যাতে তাদের মানগুলি পরিবর্তন করা যায় না। - কাইল সিম্পসন, আপনি জেএস জানেন না - এটি ও প্রজেক্টটাইপগুলি অবজেক্ট করুন


4

আমি ECMAScript 5 এ ফ্রিজ এবং সিলের মধ্যে পার্থক্যগুলি দেখছিলাম এবং পার্থক্যগুলি স্পষ্ট করার জন্য একটি স্ক্রিপ্ট তৈরি করেছি। হিমায়িত তথ্য এবং কাঠামো সহ একটি অপরিবর্তনীয় বস্তু তৈরি করে। সিল নামযুক্ত ইন্টারফেসগুলিতে পরিবর্তনগুলি প্রতিরোধ করে - কোনও যোগ করে না, মোছা হয় না - তবে আপনি বস্তুকে রূপান্তর করতে এবং এর ইন্টারফেসের অর্থটি নতুনভাবে সংজ্ঞায়িত করতে পারেন।

function run()
{
    var myObject = function() 
    { 
        this.test = "testing"; 
    }

    //***************************SETUP****************************

    var frozenObj = new myObject();
    var sealedObj = new myObject();

    var allFrozen = Object.freeze(frozenObj);
    var allSealed = Object.seal(sealedObj);
    alert("frozenObj of myObject type now frozen - Property test= " + frozenObj.test);
    alert("sealedObj of myObject type now frozen - Property test= " + sealedObj.test);

    //***************************FROZEN****************************

    frozenObj.addedProperty = "added Property"; //ignores add
    alert("Frozen addedProperty= " + frozenObj.addedProperty);
    delete frozenObj.test; //ignores delete
    alert("Frozen so deleted property still exists= " + frozenObj.test);
    frozenObj.test = "Howdy"; //ignores update
    alert("Frozen ignores update to value= " + frozenObj.test);
    frozenObj.test = function() { return "function"; } //ignores
    alert("Frozen so ignores redefinition of value= " + frozenObj.test);

    alert("Is frozen " + Object.isFrozen(frozenObj));
    alert("Is sealed " + Object.isSealed(frozenObj));
    alert("Is extensible " + Object.isExtensible(frozenObj));

    alert("Cannot unfreeze");
    alert("result of freeze same as the original object: " + (frozenObj === allFrozen).toString());

    alert("Date.now = " + Date.now());

    //***************************SEALED****************************

    sealedObj.addedProperty = "added Property"; //ignores add
    alert("Sealed addedProperty= " + sealedObj.addedProperty);
    sealedObj.test = "Howdy"; //allows update
    alert("Sealed allows update to value unlike frozen= " + sealedObj.test);
    sealedObj.test = function() { return "function"; } //allows
    alert("Sealed allows redefinition of value unlike frozen= " + sealedObj.test);
    delete sealedObj.test; //ignores delete
    alert("Sealed so deleted property still exists= " + sealedObj.test);
    alert("Is frozen " + Object.isFrozen(sealedObj));
    alert("Is sealed " + Object.isSealed(sealedObj));
    alert("Is extensible " + Object.isExtensible(sealedObj));

    alert("Cannot unseal");
    alert("result of seal same as the original object: " + (sealedObj === allSealed).toString());

    alert("Date.now = " + Date.now());
}

3

আমি জানি আমি কিছুটা দেরি করতে পারি তবে

  • সাদৃশ্য: এগুলি উভয়ই অ-এক্সটেনসেবল অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয় ।
  • পার্থক্য: কনফিগারযোগ্য স্থিতিতে , অবজেক্টের গণনাযোগ্য এবং লিখনযোগ্য বৈশিষ্ট্য সেট করা আছে false। যেখানে সিলযুক্ত লিখনযোগ্য বৈশিষ্ট্য সেট করা আছে trueএবং বিশিষ্টতাগুলির বাকীটি মিথ্যা।

6
এটি সম্পূর্ণ সঠিক নয়। Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable=== true
লিওন অ্যাডলার

2

আপনি এখন পুরো অবজেক্টকে হিমায়িত করার পরিবর্তে একক বস্তুর সম্পত্তি হিমায়িত করতে বাধ্য করতে পারেন। আপনার সাথে এই অর্জন করতে পারেন Object.definePropertyসঙ্গে writable: falseএকটি প্যারামিটার হিসাবে।

var obj = {
    "first": 1,
    "second": 2,
    "third": 3
};
Object.defineProperty(obj, "first", {
    writable: false,
    value: 99
});

এই উদাহরণে, obj.firstএখন এর মান 99 এ লক হয়েছে।


0

আমি নীচের ফাংশনগুলির তুলনা করতে এবং এই ফাংশনগুলির মধ্যে পার্থক্য ব্যাখ্যা করার জন্য একটি সাধারণ টেবিল তৈরি করেছি।

  • Object.freeze ()
  • Object.seal ()
  • Object.preventExtensions ()

উপরের তিনটি পদ্ধতির মধ্যে পার্থক্য ব্যাখ্যা করে এমন টেবিল

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