`নতুন অবজেক্ট ()` এবং অবজেক্ট আক্ষরিক স্বরলিপি মধ্যে পার্থক্য কি?


199

কোনও অবজেক্ট তৈরির জন্য এই নির্মাণকারী-ভিত্তিক সিনট্যাক্সের মধ্যে পার্থক্য কী:

person = new Object()

... এবং এই আক্ষরিক বাক্য গঠন:

person = {
    property1 : "Hello"
};

এটি উভয়ই একই কাজ করে বলে মনে হয়, যদিও জেএসলিন্ট আপনাকে বস্তুর আক্ষরিক স্বরলিপি ব্যবহার পছন্দ করে।

কোনটি ভাল এবং কেন?


7
একই সমস্ত: a = new Object, a = new Object(), a = {}, আক্ষরিক অনেক সহজ এবং যখন আগে বলে দ্রুত, নতুন কম্পাইলার আমার বক্তব্যের মিথ্যা হতে হত হতে পারে হয় কিছু পরীক্ষার আমি দৌড়ে। একই আক্ষরিক অ্যারে ক্ষেত্রে প্রযোজ্য
জুয়ান মেন্ডেস

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

1
মূলত, কোনও প্রোগ্রাম কার্যকর করার সময় যে কোনও সময়ে, রেকর্ড বা ব্লকগুলির একটি স্ট্যাক থাকে। প্রতিটি রেকর্ডে ভেরিয়েবলের একটি তালিকা রয়েছে যা সেই সুযোগে তৈরি হয়েছিল। জাভাস্ক্রিপ্টে, যদি কোনও অভিব্যক্তিতে কোনও ভেরিয়েবল থাকে এবং দোভাষী যদি সেই সুযোগের জন্য স্ট্যাক রেকর্ডে এটি না পান, এটি ভেরিয়েবলটি না পাওয়া পর্যন্ত এটি পরবর্তী রেকর্ডে যেতে থাকবে। আরও তথ্য davidshariff.com/blog/…
সামো

2
জেএসলিন্টকে এড়ানো ভাল বিকাশকারী হওয়ার প্রথম পদক্ষেপ। ব্যবহার newহ'ল এমন একটি কনভেনশন যা মধ্যযুগীয় ভাষার অর্থহীন নীটপিকিংকে ছাড়িয়ে যায়। ব্যবহার করুন newকারণ এর অর্থ পরিষ্কার। 99.9% ক্ষেত্রে, পারফরম্যান্সের লাভগুলি অপ্রাসঙ্গিক।
Hal50000

1
@ হালুদি 50000 কাদের মতে ভাষা?
Xam

উত্তর:


124

তারা দু'জন একই কাজ করে (যদি না কেউ অস্বাভাবিক কিছু করে থাকে) তবে আপনার দ্বিতীয়টি কোনও বস্তু তৈরি করে এবং এতে একটি সম্পত্তি যুক্ত করে। কিন্তু আক্ষরিক স্বরলিপি উত্স কোডে কম স্থান নেয়। এটি যা ঘটছে তা স্পষ্টরূপে স্বীকৃত, সুতরাং ব্যবহার করে new Object()আপনি সত্যিই কেবল আরও বেশি টাইপ করছেন এবং (তাত্ত্বিকভাবে, জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা অনুকূলিত না হলে) একটি অপ্রয়োজনীয় ফাংশন কল করছেন।

এইগুলো

person = new Object() /*You should put a semicolon here too.  
It's not required, but it is good practice.*/ 
-or-

person = {
    property1 : "Hello"
};

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

"অসাধারণ কিছু" যা কেউ করতে পারে তা হ'ল ছায়া বা ডিফল্ট গ্লোবালকে অর্পণ করা Object:

// Don't do this
Object = 23;

যে অত্যন্ত অস্বাভাবিক ক্ষেত্রে new Objectব্যর্থ {}হবে তবে কাজ করবে।

অনুশীলনে, এর new Objectপরিবর্তে কখনও ব্যবহার করার কারণ নেই {}(যদি আপনি এটি খুব অস্বাভাবিক জিনিস না করেন)।


11
লেখক এই উত্তরটি সঠিক হিসাবে বেছে নিয়েছেন তবে এটি অসম্পূর্ণ। সচেতন থাকুন যখন আপনি মেমরি বরাদ্দ পাবেন তখন দুটি বাক্য গঠনটির মধ্যে পার্থক্য রয়েছে are
শর্টস

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

এফওয়াইআইয়েরও () new Object()দরকার নেই। (প্রয়োজনীয় জিনিস সম্পর্কে কথা বলা)
রই নমির

আমি মনে করি আমাদের বর্তমান স্পেসিফিকেশন হিসাবে নতুন ব্যবহার করা প্রয়োজন । আমাকে আপনার ভাবনাগুলি @ কেভিন
পাভান মহেশ

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

234

আপনার উদাহরণ হিসাবে পদ্ধতি ছাড়া একটি সাধারণ অবজেক্টের জন্য কোনও পার্থক্য নেই। তবে, আপনি যখন নিজের অবজেক্টে পদ্ধতি যুক্ত করতে শুরু করেন তখন একটি বড় পার্থক্য রয়েছে is

আক্ষরিক উপায়:

function Obj( prop ) { 
    return { 
        p : prop, 
        sayHello : function(){ alert(this.p); }, 
    }; 
} 

প্রোটোটাইপ উপায়:

function Obj( prop ) { 
    this.p = prop; 
} 
Obj.prototype.sayHello = function(){alert(this.p);}; 

উভয় উপায়ে এ জাতীয় উদাহরণ তৈরি করতে দেয় Obj:

var foo = new Obj( "hello" ); 

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


39
আমার কাছে প্রশ্নটি খালি বস্তু তৈরি করতে new Object()বনাম ব্যবহারের মধ্যে পার্থক্য সম্পর্কে আরও ছিল {}
পিটার

11
@ লোবাবব প্রথম বাক্যটি বাদ দিয়ে, এই উত্তরটি আসলে ওপি-র প্রশ্ন সম্পর্কে কোনও তথ্য সরবরাহ করে না। এটিতে 'নতুন অবজেক্ট () `কোথাও নেই। সত্যি বলতে গেলে, আমার মনে হয় মিঃ ডেভিড প্রশ্নটি ভুল বুঝেছেন।
জেএলআরিশ

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

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

3
আমি এই উত্তরটির জন্য এসেছি, এমন একটি প্রশ্নের উপর ভিত্তি করে যা আমার মত ধরণের ছিল, তবে আমার যা জানা দরকার তা ঠিক শিখতে শেষ করেছি। ধন্যবাদ.
প্যাট মিগলিয়াচিয়ো

55

জাভাস্ক্রিপ্টে, আমরা দুটি উপায়ে একটি নতুন ফাঁকা বস্তু ঘোষণা করতে পারি:

var obj1 = new Object();  
var obj2 = {};  

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

  1. এটি সংক্ষিপ্ত (10 অক্ষর সুনির্দিষ্ট হতে হবে)
  2. ফ্লাইতে অবজেক্ট তৈরি করা সহজ এবং আরও বেশি কাঠামোগত
  3. কিছু বাফুন অজান্তেই অবজেক্টকে ওভাররাইড করেছে কিনা তা বিবেচ্য নয়

একটি নতুন অবজেক্ট বিবেচনা করুন যার মধ্যে নাম এবং টেলনো সদস্য রয়েছে। নতুন অবজেক্ট () কনভেনশনটি ব্যবহার করে, আমরা এটি এটি তৈরি করতে পারি:

var obj1 = new Object();  
obj1.Name = "A Person";  
obj1.TelNo = "12345"; 

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

এই যেখানে বস্তুর আক্ষরিক স্বরলিপি সাহায্য করতে পারে:

var obj1 = {Name:"A Person",TelNo="12345"};  

এখানে আমরা কোডের এক লাইনে এবং উল্লেখযোগ্যভাবে কম অক্ষরগুলিতে একই প্রভাব অর্জন করেছি।

উপরের বিষয়বস্তু নির্মাণের পদ্ধতিগুলির আরও একটি আলোচনা এখানে পাওয়া যাবে: জাভাস্ক্রিপ্ট এবং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (ওওপি)।

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

( Http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ থেকে )


1
কীভাবে অবজেক্ট.ক্রেট? দেখুন: ডেভেলপার.মোজিলা.আর.ইন-
ফিল

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

41

নোড.জেএস ব্যবহার করে আমার মেশিনে, আমি নিম্নলিখিতগুলি চালিয়েছি:

console.log('Testing Array:');
console.time('using[]');
for(var i=0; i<200000000; i++){var arr = []};
console.timeEnd('using[]');

console.time('using new');
for(var i=0; i<200000000; i++){var arr = new Array};
console.timeEnd('using new');

console.log('Testing Object:');

console.time('using{}');
for(var i=0; i<200000000; i++){var obj = {}};
console.timeEnd('using{}');

console.time('using new');
for(var i=0; i<200000000; i++){var obj = new Object};
console.timeEnd('using new');

দ্রষ্টব্য, এটি এখানে যা পাওয়া যায় তার একটি এক্সটেনশান: আরার = [] আরার = নতুন অ্যারের চেয়ে দ্রুত কেন?

আমার আউটপুট নিম্নলিখিত ছিল:

Testing Array:
using[]: 1091ms
using new: 2286ms
Testing Object:
using{}: 870ms
using new: 5637ms

তাই পরিষ্কারভাবে {} এবং [] খালি জিনিস / অ্যারে তৈরির জন্য নতুন ব্যবহারের চেয়ে দ্রুত।


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

2
আকর্ষণীয় সংখ্যা। এমন লোক আছে যাদের সম্পর্কে সচেতন হওয়া দরকার, তবে আমি এড়িয়ে চলেছি যে এমনকি অল্প পরিমাণে 200,000 বস্তু বরাদ্দ করা আমার জন্য কেবল 5.6 মিমি খরচ করে, তাই আমি এটি নিয়ে চিন্তিত হব না।

নোডে 10.13.0 টিতে টেস্টিং অ্যারে পরিবর্তন হয়েছে: ব্যবহার করে []: 117.178ms নতুন ব্যবহার করে: 116.947ms পরীক্ষার অবজেক্ট: {}: 116.252ms ব্যবহার করে নতুন: 115.910 মিমি
পাইরেট অ্যাপ

31

এখানে প্রত্যেকে দুজনের মিলের কথা বলছে। আমি পার্থক্য তুলে ধরছি।

  1. ব্যবহারের new Object()ফলে আপনি অন্য একটি জিনিস পাস করতে পারবেন। সুস্পষ্ট ফলাফলটি হ'ল নতুন নির্মিত বস্তুটি একই রেফারেন্সে সেট করা হবে। এখানে একটি নমুনা কোড রয়েছে:

    var obj1 = new Object();
    obj1.a = 1;
    var obj2 = new Object(obj1);
    obj2.a // 1
  2. ওওপি অবজেক্টের মতো ব্যবহার কেবলমাত্র বস্তুর মধ্যে সীমাবদ্ধ নয়। অন্যান্য ধরণের এটিও পাস হতে পারে। ফাংশন অনুসারে টাইপ সেট করবে। উদাহরণস্বরূপ আমরা যদি এটিতে পূর্ণসংখ্যা 1 পাস করি তবে আমাদের জন্য টাইপ সংখ্যার একটি অবজেক্ট তৈরি হবে।

    var obj = new Object(1);
    typeof obj // "number"
  3. উপরের পদ্ধতি ( new Object(1)) ব্যবহার করে তৈরি করা অবজেক্টটি যদি কোনও সম্পত্তি যুক্ত করা হয় তবে অবজেক্ট টাইপে রূপান্তরিত হবে।

    var obj = new Object(1);
    typeof obj // "number"
    obj.a = 2;
    typeof obj // "object"
  4. যদি বস্তুটি শিশু শ্রেণীর অবজেক্টের অনুলিপি হয় তবে আমরা ধরণের রূপান্তর ছাড়াই সম্পত্তি যুক্ত করতে পারি।

    var obj = new Object("foo");
    typeof obj // "object"
    obj === "foo" // true
    obj.a = 1;
    obj === "foo" // true
    obj.a // 1
    var str = "foo";
    str.a = 1;
    str.a // undefined

3
আমি শেষ দুটি লাইন সম্পর্কে খুব বিভ্রান্ত হয়েছি .. আপনি যদি স্ট্রিয়াকে অর্পণ করেন তবে মান 1, স্ট্রেনা অপরিবর্তিত হয়? .. @ জারমিন বাজাজিন
আন্দ্রে স্কারাফনি

3
@ আন্ড্রেআস্যাকারাফনি কারণ strধরণের stringতাই আপনি এটিতে কোনও সম্পত্তি বরাদ্দ করতে পারবেন না।jsfiddle.net/grq6hdx7/1
ক্রিস বিয়ার

1
4 এর উত্তর পরিবর্তন হয়েছে? আমি সর্বশেষ ক্রোম 53var obj = new Object("foo"); typeof obj; obj === "foo" // true
উইলিয়াম হিলটন

21

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

কনস্ট্রাক্টর ফাংশনটি ব্যবহার করে কোনও বস্তু তৈরির উদাহরণ এখানে রয়েছে (নীচে কোড ব্যাখ্যা দেখুন):

function Person(firstname, lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
}

Person.prototype.fullname = function() {
    console.log(this.firstname + ' ' + this.lastname);
}

var zubaer = new Person('Zubaer', 'Ahammed');
var john = new Person('John', 'Doe');

zubaer.fullname();
john.fullname();

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

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

যাইহোক, আপনি যদি একই কার্যকারিতাটি " অবজেক্ট আক্ষরিক " সিনট্যাক্সের নীচের মতো সমস্ত বস্তুর পুরো নাম () তৈরি করতে হবে:

var zubaer = {
    firstname: 'Zubaer',
    lastname: 'Ahammed',
    fullname: function() {
        console.log(this.firstname + ' ' + this.lastname);
    }
};

var john= {
    firstname: 'John',
    lastname: 'Doe',
    fullname: function() {
        console.log(this.firstname + ' ' + this.lastname);
    }
};

zubaer.fullname();
john.fullname();

শেষ পর্যন্ত, আপনি এখন যদি কেন জিজ্ঞাসা করেন আমি কেন ব্যবহার করব বস্তুর আক্ষরিক পদ্ধতির পরিবর্তে কনস্ট্রাক্টর ফাংশন পদ্ধতির ব্যবহার করব :

*** প্রোটোটাইপাল উত্তরাধিকার একটি উত্তরাধিকারের একটি সহজ শৃঙ্খলার মঞ্জুরি দেয় যা প্রচুর পরিমাণে দরকারী এবং শক্তিশালী হতে পারে।

*** এটি কনস্ট্রাক্টর ফাংশন প্রোটোটাইপে সংজ্ঞায়িত সাধারণ পদ্ধতি এবং বৈশিষ্ট্যগুলির উত্তরাধিকারসূত্রে স্মৃতি সংরক্ষণ করে। অন্যথায়, আপনাকে সেগুলি বারবার সমস্ত বস্তুর মধ্যে অনুলিপি করতে হবে।

আশা করি এটা বোধ গম্য।


ধন্যবাদ! আক্ষরিক বস্তুটিতে "এই" অনুপস্থিত যুক্ত করার জন্য কার্ল। এটি একটি ভয়াবহ ভুল ছিল ... আমার এই ধরণের ভুল করা উচিত নয়।
মোঃ যুবায়ের আহমদ

"আপনি আক্ষরিক সিনট্যাক্স দিয়ে তৈরি কোনও বস্তুর উত্তরাধিকারী হতে পারবেন না।" - সত্য নয় (আমি বিশ্বাস করি) আপনি ব্যবহার করতে পারেন Object.create(<object defined using literal notation>)বা new Object(<object defined using literal notation>)এবং প্রয়োজনীয় উত্তরাধিকার চেইন তৈরি করুন।
বালাজেরেক

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

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

@ বালাজেরিক উদাহরণ:function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
মোঃ

9

এছাড়াও, কয়েকটি 'ও'র জাভাস্ক্রিপ্ট বই অনুসারে .... (উদ্ধৃত)

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


24
অপেক্ষা কি ও'রায়েল টাইপো বা ইচ্ছাকৃত পাং ছিল? তাদের এটি তাদের বই বিপণনের জন্য ব্যবহার করা উচিত!
টিম ওগিলভি

3

ES6 / ES2015 এর জন্য আমি একটি পার্থক্য খুঁজে পেয়েছি। আপনি শর্টহ্যান্ড তীর ফাংশন সিনট্যাক্স ব্যবহার করে কোনও জিনিস ফেরত দিতে পারবেন না, যদি না আপনি অবজেক্টটিকে ঘিরে থাকেন new Object()

> [1, 2, 3].map(v => {n: v});
[ undefined, undefined, undefined ]
> [1, 2, 3].map(v => new Object({n: v}));
[ { n: 1 }, { n: 2 }, { n: 3 } ]

এটি কারণ কারণ সংকলক {}বন্ধনী দ্বারা বিভ্রান্ত হয় এবং মনে করে n: iএকটি লেবেল: বিবৃতি নির্মাণ; সেমিকোলন alচ্ছিক তাই এটি এটি সম্পর্কে অভিযোগ করে না।

আপনি যদি বস্তুটিতে অন্য কোনও সম্পত্তি যুক্ত করেন এটি শেষ পর্যন্ত একটি ত্রুটি ছুঁড়ে দেবে।

$ node -e "[1, 2, 3].map(v => {n: v, m: v+1});"
[1, 2, 3].map(v => {n: v, m: v+1});
                           ^

SyntaxError: Unexpected token :

4
আপনি এখনও একটি তীর ফাংশন ব্যবহার করতে পারেন, আপনার আরও বেশি ধনুর্বন্ধনী এবং একটি রিটার্ন দরকার: [1, 2, 3].map(v => { return {n: v}; });আপনাকে একই জিনিসটি
জালিয়ে দেবে

অবশ্যই আপনি নিয়মিত তীর ফাংশন ব্যবহার করতে পারেন, আমি যা বলছিলাম তা ছিল শর্টহ্যান্ড সংস্করণ, অর্থাত্ param => return_value, এবং এই ক্ষেত্রে ব্যবহার {}এবং এর new Object()মধ্যে পার্থক্য ।
আন্দ্রে সিমিনেস্কু

11
আপনি এখনও শর্টহ্যান্ড সংস্করণ এবং নিয়মিত তীর ফাংশন ব্যবহার করতে পারেন। কেবলমাত্র এক জোড়া বন্ধনী দিয়ে {n: v w মোড়ানো:[1, 2, 3].map(v => ({n: v}));
স্টিফেন সি

1

2019 আপডেট

আমি আমার ওএসএক্স উচ্চ সিয়েরা 10.13.6 নোড সংস্করণ 10.13.0 এ @ রজলৌরা হিসাবে একই কোডটি চালিয়েছি এবং এগুলি ফলাফল

console.log('Testing Array:');
console.time('using[]');
for(var i=0; i<200000000; i++){var arr = []};
console.timeEnd('using[]');

console.time('using new');
for(var i=0; i<200000000; i++){var arr = new Array};
console.timeEnd('using new');

console.log('Testing Object:');

console.time('using{}');
for(var i=0; i<200000000; i++){var obj = {}};
console.timeEnd('using{}');

console.time('using new');
for(var i=0; i<200000000; i++){var obj = new Object};
console.timeEnd('using new');


Testing Array:
using[]: 117.613ms
using new: 117.168ms
Testing Object:
using{}: 117.205ms
using new: 118.644ms

-2

আপনি যদি 10 হাজার উদাহরণ তৈরি করেন তবে মেমোরির ব্যবহার আলাদা different new Object()শুধুমাত্র একটি অনুলিপি {}রাখবে এবং 10 হাজার অনুলিপি রাখবে।


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