অবজেক্ট.ক্রিয়েট () এবং নতুন সামফান্শন () এর মধ্যে পার্থক্য বোঝা


390

আমি সম্প্রতি Object.create()জাভাস্ক্রিপ্টের পদ্ধতিটিতে হোঁচট খেয়েছি, এবং এটি কীভাবে কোনও অবজেক্টের নতুন উদাহরণ তৈরি করা থেকে আলাদা new SomeFunction()এবং আপনি যখন একে অপরের উপরে ব্যবহার করতে চান তা অনুমান করার চেষ্টা করছি ।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

var test = {
  val: 1,
  func: function() {
    return this.val;
  }
};
var testA = Object.create(test);

testA.val = 2;
console.log(test.func()); // 1
console.log(testA.func()); // 2

console.log('other test');
var otherTest = function() {
  this.val = 1;
  this.func = function() {
    return this.val;
  };
};

var otherTestA = new otherTest();
var otherTestB = new otherTest();
otherTestB.val = 2;
console.log(otherTestA.val); // 1 
console.log(otherTestB.val); // 2

console.log(otherTestA.func()); // 1
console.log(otherTestB.func()); // 2

লক্ষ্য করুন যে উভয় ক্ষেত্রে একই আচরণ লক্ষ্য করা যায়। আমার কাছে মনে হয় যে এই দুটি পরিস্থিতির মধ্যে প্রাথমিক পার্থক্যগুলি হ'ল:

  • Object.create()প্রকৃতপক্ষে ব্যবহৃত বস্তুটি নতুন বস্তুর প্রোটোটাইপ গঠন করে, যেখানে new Function()ঘোষিত বৈশিষ্ট্য / ফাংশন থেকে প্রোটোটাইপ গঠন করে না।
  • Object.create()ফাংশনাল সিনট্যাক্সের মতো আপনি সিনট্যাক্সের সাথে ক্লোজার তৈরি করতে পারবেন না । এটি জাভাস্ক্রিপ্টের লেক্সিকাল (বনাম ব্লক) টাইপ স্কোপকে দিয়ে যৌক্তিক।

উপরের বিবৃতিগুলি কি সঠিক? আর আমি কি কিছু মিস করছি? আপনি কখন অন্যটির উপরে ব্যবহার করবেন?

সম্পাদনা: উপরের কোড নমুনার jsfiddle সংস্করণে লিঙ্ক: http://jsfiddle.net/rZfYL/


উত্তর:


247

অবজেক্ট.ক্রিয়েটে ব্যবহৃত বস্তুটি আসলে নতুন বস্তুর প্রোটোটাইপ গঠন করে, যেখানে নতুন ফাংশন () হিসাবে ঘোষিত বৈশিষ্ট্য / ফাংশন প্রোটোটাইপ গঠন করে না।

হ্যাঁ, Object.createএমন একটি বস্তু তৈরি করে যা তার প্রথম যুক্তি হিসাবে সরাসরি পাস হওয়া থেকে উত্তরাধিকার সূত্রে আসে।

কনস্ট্রাক্টর ফাংশন সহ, সদ্য নির্মিত বস্তুটি কনস্ট্রাক্টরের প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত: যেমন:

var o = new SomeConstructor();

উপরের উদাহরণে oসরাসরি উত্তরাধিকার সূত্রে প্রাপ্ত SomeConstructor.prototype

এখানে একটি পার্থক্য রয়েছে, Object.createআপনি একটি অবজেক্ট তৈরি করতে পারেন যা কোনও কিছুর থেকে উত্তরাধিকারসূত্রে আসে না Object.create(null);, অন্যদিকে, আপনি যদি সেট করে থাকেন SomeConstructor.prototype = null;যে সদ্য নির্মিত বস্তুটি উত্তরাধিকার সূত্রে প্রাপ্ত হবে Object.prototype

ফাংশনাল সিনট্যাক্সের মতো আপনি Object.create সিনট্যাক্সের সাথে ক্লোজার তৈরি করতে পারবেন না। এটি জাভাস্ক্রিপ্টের লেক্সিকাল (বনাম ব্লক) টাইপ স্কোপকে দিয়ে যৌক্তিক।

ঠিক আছে, আপনি ক্লোজারগুলি তৈরি করতে পারেন, যেমন সম্পত্তি বর্ণনাকারী যুক্তি ব্যবহার করে:

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }
});

o.foo; // "foobar"

নোট করুন যে আমি ECMAScript 5 ম সংস্করণ Object.createপদ্ধতি সম্পর্কে বলছি , ক্রকফোর্ডের শিম নয়।

পদ্ধতি নেটিভ সর্বশেষ ব্রাউজারে বাস্তবায়ন করতে হবে, এই পরীক্ষা শুরু হচ্ছে সামঞ্জস্য টেবিল


2
@ সিএমএস 2 টি প্রশ্ন। 1) অবজেক্ট.ক্রিয়েটে (নাল) স্কোপ চেইনটি এখনও বিশ্বব্যাপী স্কোপ (যেমন একটি ব্রাউজারে 'উইন্ডো') এ সমাপ্ত হয়, বা এটি নিজেই সমাপ্ত হয়? ২) এখনও অবধি আমার কাছে স্পষ্ট নয় যে কেন অবজেক্ট.ক্রিয়েট চালু করা হয়েছিল (উদাহরণস্বরূপ কোন বৈশিষ্ট্যটি এটিকে সম্বোধন করে না?) এবং কেন এটি নতুন ফাংশন () এর পরিবর্তে ব্যবহার করা হবে;
ম্যাট

9
@ ম্যাট, ১) স্কোপ চেইন আসলে এখানে সম্পর্কিত ধারণা নয়, স্কোপ চেইন শনাক্তকারী রেজোলিউশনের সাথে সম্পর্কিত , যেমন: foo;বর্তমান লেক্সিকাল পরিবেশে কীভাবে সমাধান করা হয় । 2) উত্তরাধিকার বাস্তবায়নের সহজ উপায় সরবরাহ করার জন্য, এটি একটি সত্যই শক্তিশালী নির্মাণ। আইএমও আমি এটি ব্যবহার করব কারণ এটি সত্যই সহজ এবং হালকা ওজনের, কিন্তু উত্পাদন কোডের জন্য, ES5 ব্যাপকভাবে সমর্থনযোগ্য না হওয়া পর্যন্ত আমাদের এখনও কিছুটা সময় অপেক্ষা করতে হবে। অনুপস্থিত বৈশিষ্ট্যগুলি সম্পর্কে, "প্রাচীন" অবজেক্ট তৈরি করার ঘটনাটি Object.create(null);অনুপস্থিত ছিল, এটি নির্ভরযোগ্য হ্যাশ-টেবিলের মতো বস্তুগুলি কার্যকর করতে কার্যকর ...
সিএমএস

@ সিএমএস ধন্যবাদ সুতরাং আপনি যখন 'অবজেক্ট.ক্রিয়েট' ব্যবহার করে কোনও বস্তু তৈরি করেন, তখন আপনি সেই বস্তুটি বেছে নেওয়ার দক্ষতা পাবেন যা এর প্রোটোটাইপ হওয়া উচিত।
আনশুল

@ সিএমএস ঠিক আছে, এর Object.create(null)অর্থ হ'ল hasOwnProperty()পুনরাবৃত্তি করার কারণে আপনার কোনও বংশ পরম্পরায় হ'ল ক্র্যাপ ব্যবহার করতে হবে না ??? আমি এটি পছন্দ করি - ধন্যবাদ। অবশ্যই, প্রত্যেকে এখনও কাজটি করছে hasOwnPropertyযেহেতু প্রত্যেকে ব্যবহার করবে না Object.create(null)তাই আমি নিশ্চিত নই যে এটি একটি আসল উপকার ... এখনও অবধি আমি Object.create()সম্পূর্ণ অনিচ্ছুক অন্যান্য "সুবিধা" পেয়েছি ।
user949300

424

খুব সহজভাবে বললেন, new Xহয় Object.create(X.prototype)অতিরিক্ত চলমান সঙ্গে constructorফাংশন। (এবং প্রকৃত অবজেক্টকে constructorসুযোগ দেওয়া যা তার returnপরিবর্তে অভিব্যক্তির ফলাফল হওয়া উচিত this))

এটাই. :)

বাকি উত্তরগুলি কেবল বিভ্রান্তিকর, কারণ স্পষ্টতই আর কেউই এর সংজ্ঞাটি পড়েন না new। ;)


23
+1 সরলতা এবং স্পষ্টতা! (যদিও Object.create (নাল) একটি দুর্দান্ত বিকল্প বলে মনে হচ্ছে - সম্ভবত এটি উল্লেখ করা উচিত)।
user949300

এটিকে সহজ রাখার উপায় রাখুন
বিল

যে শুধু প্রশ্ন ছেড়ে "অপেক্ষার, তাই ফাংশন এগুলির নমুনা আছে খুব ? যারা এবং মধ্যে সম্পর্ক কী বস্তু এগুলির নমুনা?"
কিওয়ার্টি

3
@ কিওয়ার্টি: জেএসে, সবকিছুই একটি বস্তু। :) তারা এটিকে জাভা থেকে অনুলিপি করেছে, যিনি এটিকে ছোট্ট টাল্ক থেকে অনুলিপি করেছেন, যিনি এটি দিয়ে শেষ পর্যন্ত গিয়েছিলেন। এটি "উত্থান" এর একটি দুর্দান্ত কেস, যা সাধারণভাবে জীবনকে সহজ করে তোলে।
Evi1M4chine

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

204

উভয় কলের জন্য অভ্যন্তরীণভাবে সংঘটিত পদক্ষেপগুলি এখানে:
(ইঙ্গিত: তৃতীয় ধাপে একমাত্র পার্থক্য)


new Test():

  1. new Object()আপত্তি তৈরি
  2. সেট obj.__proto__করাTest.prototype
  3. return Test.call(obj) || obj; // normally obj is returned but constructors in JS can return a value

Object.create( Test.prototype )

  1. new Object()আপত্তি তৈরি
  2. সেট obj.__proto__করাTest.prototype
  3. return obj;

সুতরাং মূলত Object.createকনস্ট্রাক্টরকে কার্যকর করা হয় না।


@ রে এইভাবে অবজেক্টটি ব্যবহার করে? কন্ট্রাক্টর ফাংশনে উল্লিখিত ফাংশনের বৈশিষ্ট্যগুলি আমরা ফন্টের মধ্যে রাখি?

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

বেশিরভাগ কনস্ট্রাক্টর ফাংশনের মতো পদ্ধতিগুলিও প্রত্যাবর্তিত অবজেক্টের মধ্যে সংজ্ঞায়িত করা হয়, newমূলত সমস্ত ফাংশনটি সদৃশ হয়ে Object.createথাকে , যখন হয় না।
19

61

আমাকে ব্যাখ্যা করার চেষ্টা করুন ( ব্লগে আরও ):

  1. আপনি যখন Carকনস্ট্রাক্টর লেখেন var Car = function(){}, জিনিসগুলি অভ্যন্তরীণভাবে এইভাবে হয়: জাভাস্ক্রিপ্ট অবজেক্ট তৈরি করার সময় প্রোটোটাইপাল চেইনের একটি ডায়াগ্রাম আমাদের একটি {prototype}গোপন লিঙ্ক রয়েছে Function.prototypeযার সাথে অ্যাক্সেসযোগ্য নয় এবং একটি prototypeলিঙ্ক Car.prototypeযা অ্যাক্সেসযোগ্য এবং এর প্রকৃত constructorরয়েছে Car। ফাংশন.প্রোটোটাইপ এবং কার.প্রোটোটাইপ উভয়েরই লিংক রয়েছে Object.prototype
  2. যখন আমরা newঅপারেটর এবং createপদ্ধতি ব্যবহার করে দুটি সমতুল্য বস্তু তৈরি করতে চাই তখন আমাদের এটির মতো এটি করতে হবে: Honda = new Car();এবং Maruti = Object.create(Car.prototype)পৃথক পৃথক অবজেক্ট তৈরির পদ্ধতির জন্য প্রোটোটাইপাল চেইনের একটি চিত্র কি হচ্ছে?

    Honda = new Car();- আপনি যখন এই জাতীয় কোনও বস্তু তৈরি করেন তখন লুকানো {prototype}সম্পত্তির দিকে লক্ষ্য করা যায় Car.prototype। সুতরাং এখানে, {prototype}হোন্ডা অবজেক্টের সর্বদা থাকবে Car.prototype- আমাদের {prototype}কাছে অবজেক্টটির সম্পত্তি পরিবর্তন করার কোনও বিকল্প নেই । আমি যদি আমাদের নতুন নির্মিত বস্তুর প্রোটোটাইপ পরিবর্তন করতে চাই?
    Maruti = Object.create(Car.prototype)- আপনি যখন এই জাতীয় কোনও বস্তু তৈরি করেন তখন আপনার নিজের সামগ্রীর {prototype}সম্পত্তি বাছাই করার জন্য অতিরিক্ত বিকল্প থাকে । আপনি যদি কার.প্রোটোটাইপ চান তবে ফাংশনটিতে {prototype}এটি প্যারামিটার হিসাবে পাস করুন। যদি আপনি কোন না চান তাহলে {prototype}আপনার বস্তুর জন্য তারপর আপনি পাস করতে পারেন nullভালো: Maruti = Object.create(null)

উপসংহার - পদ্ধতিটি ব্যবহার করে Object.createআপনার নিজের সামগ্রীর {prototype}সম্পত্তি বাছাই করার স্বাধীনতা রয়েছে । ইন new Car();, আপনার যে স্বাধীনতা নেই।

ওও জাভাস্ক্রিপ্টে পছন্দের উপায়:

ধরুন আমাদের দুটি বস্তু আছে aএবং b

var a = new Object();
var b = new Object();

এখন, ধরুন aকিছু পদ্ধতি রয়েছে যা bঅ্যাক্সেস করতে চায়। তার জন্য, আমাদের অবজেক্টের উত্তরাধিকার প্রয়োজন ( কেবলমাত্র যদি আমরা এই পদ্ধতিগুলিতে অ্যাক্সেস চাই তবে aতার মূল প্রতিভা হওয়া উচিত b)। যদি আমরা এর প্রোটোটাইপগুলি পরীক্ষা করি aএবং bতারপরে আমরা জানতে পারি যে তারা প্রোটোটাইপটি ভাগ করে নিয়েছে Object.prototype

Object.prototype.isPrototypeOf(b); //true
a.isPrototypeOf(b); //false (the problem comes into the picture here).

সমস্যা - আমরা aপ্রোটোটাইপ হিসাবে অবজেক্টটি চাই b, তবে এখানে আমরা bপ্রোটোটাইপ দিয়ে অবজেক্ট তৈরি করেছি Object.prototypeসমাধান - ECMAScript 5 চালু করা হয়েছে Object.create(), সহজেই এই জাতীয় উত্তরাধিকার অর্জনের জন্য। যদি আমরা এটির bমতো অবজেক্ট তৈরি করি :

var b = Object.create(a);

তারপর,

a.isPrototypeOf(b);// true (problem solved, you included object a in the prototype chain of object b.)

সুতরাং, যদি আপনি অবজেক্ট ওরিয়েন্টেড স্ক্রিপ্টিং করেন তবে Object.create()উত্তরাধিকারের জন্য খুব কার্যকর।


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

@ আনশুল আপনি বলেছিলেন যে a.isPrototypeOf(b);ফিরে আসবে falseযা সঠিক, newঅপারেটরের সাথে এটি করার সঠিক উপায় এখানে। - jsfiddle.net/167onunp
সাগর কারিরা

আপনি এটি না করে কেবল খ এর প্রোটোটাইপ সম্পত্তি সেট করবেন না কেন?
অ্যামনেস্টিক

আপনার ব্লগে নিবন্ধটি পছন্দ করেছে। ধারণাটি আরও ভালভাবে বুঝতে আমাকে সহায়তা করেছে। ধন্যবাদ.
অবিচলিত_আড্ডি

1
উপসংহারটি সব বলে।
কুশলভম

44

এই:

var foo = new Foo();

এবং

var foo = Object.create(Foo.prototype);

বেশ অনুরূপ। একটি গুরুত্বপূর্ণ পার্থক্য হ'ল new Fooআসলে কনস্ট্রাক্টর কোড চালায়, যেখানে Object.createকোড চালানো হবে না code

function Foo() {
    alert("This constructor does not run with Object.create");
}

মনে রাখবেন যে আপনি যদি এর দ্বি-পরামিতি সংস্করণ ব্যবহার করেন Object.create()তবে আপনি আরও অনেক শক্তিশালী কাজ করতে পারেন।


1
দুর্দান্ত ব্যাখ্যা। আমি যুক্ত করতে পারি, এর Object.createমতো সহজতম ফর্মটি ব্যবহার করে প্রোটোটাইপ উত্তরাধিকারের সুযোগ গ্রহণের সময় আপনাকে আপনার কোড থেকে কনস্ট্রাক্টর ফাংশন বাদ দিতে দেয়।
রিকি বয়েস

23

পার্থক্যটি তথাকথিত "সিউডোক্ল্যাসিকাল বনাম প্রোটোটাইপাল উত্তরাধিকার"। এই পরামর্শটি হ'ল আপনার কোডটিতে কেবল একটি প্রকার ব্যবহার করুন, দুটি মিশ্রন না করে।

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

প্রোটোটাইপাল উত্তরাধিকারে (অবজেক্ট.ক্রিয়েট ব্যবহার করে) আপনি সরাসরি একটি নির্দিষ্ট ব্যক্তি "অ্যালিস" তৈরি করেন এবং তারপরে প্রোটোটাইপ হিসাবে "অ্যালিস" ব্যবহার করে অন্য একজন ব্যক্তির "বব" তৈরি করেন। এখানে কোন "শ্রেণি" নেই; সমস্ত বস্তু হয়।

অভ্যন্তরীণভাবে, জাভাস্ক্রিপ্টে "প্রোটোটাইপাল উত্তরাধিকার" ব্যবহার করা হয়; "সিউডোক্ল্যাসিকাল" উপায়টি কেবল কিছুটা চিনি।

দুটি উপায়ে তুলনার জন্য এই লিঙ্কটি দেখুন ।


21
function Test(){
    this.prop1 = 'prop1';
    this.prop2 = 'prop2';
    this.func1 = function(){
        return this.prop1 + this.prop2;
    }
};

Test.prototype.protoProp1 = 'protoProp1';
Test.prototype.protoProp2 = 'protoProp2';
var newKeywordTest = new Test();
var objectCreateTest = Object.create(Test.prototype);

/* Object.create   */
console.log(objectCreateTest.prop1); // undefined
console.log(objectCreateTest.protoProp1); // protoProp1 
console.log(objectCreateTest.__proto__.protoProp1); // protoProp1

/* new    */
console.log(newKeywordTest.prop1); // prop1
console.log(newKeywordTest.__proto__.protoProp1); // protoProp1

সারসংক্ষেপ:

1) newকীওয়ার্ড সহ দুটি বিষয় লক্ষণীয়;

ক) ফাংশনটি কনস্ট্রাক্টর হিসাবে ব্যবহৃত হয়

খ) function.prototypeঅবজেক্টটি __proto__সম্পত্তিতে প্রেরণ করা হয় ... বা যেখানে __proto__সমর্থিত নয়, এটি দ্বিতীয় স্থান যেখানে নতুন বস্তুটি বৈশিষ্ট্যগুলি সন্ধান করে

2) আপনার সাথে Object.create(obj.prototype)একটি অবজেক্ট ( obj.prototype) তৈরি করা হচ্ছে এবং উদ্দেশ্যযুক্ত বস্তুটি এটি পাস করা হচ্ছে .. এখন নতুন অবজেক্টটিও __proto__আপত্তি.প্রোটোটাইপের দিকে ইঙ্গিত করছে (দয়া করে এর জন্য xj9 দ্বারা উত্তরগুলি রেফ করুন)


15

বস্তু তৈরির বৈকল্পিক।


বৈকল্পিক 1 : ' নতুন অবজেক্ট () ' -> তর্ক ছাড়াই অবজেক্ট কনস্ট্রাক্টর।

var p1 = new Object(); // 'new Object()' create and return empty object -> {}

var p2 = new Object(); // 'new Object()' create and return empty object -> {}

console.log(p1); // empty object -> {}

console.log(p2); // empty object -> {}

// p1 and p2 are pointers to different objects
console.log(p1 === p2); // false

console.log(p1.prototype); // undefined

// empty object which is in fact Object.prototype
console.log(p1.__proto__); // {}

// empty object to which p1.__proto__ points
console.log(Object.prototype); // {}

console.log(p1.__proto__ === Object.prototype); // true

// null, which is in fact Object.prototype.__proto__
console.log(p1.__proto__.__proto__); // null

console.log(Object.prototype.__proto__); // null

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


ভেরিয়েন্ট 2 : ' নতুন অবজেক্ট (ব্যক্তি) ' -> যুক্তির সাথে নির্মাণকারী অবজেক্ট।

const person = {
    name: 'no name',
    lastName: 'no lastName',
    age: -1
}

// 'new Object(person)' return 'person', which is pointer to the object ->
//  -> { name: 'no name', lastName: 'no lastName', age: -1 }
var p1 = new Object(person);

// 'new Object(person)' return 'person', which is pointer to the object ->
//  -> { name: 'no name', lastName: 'no lastName', age: -1 }
var p2 = new Object(person);

// person, p1 and p2 are pointers to the same object
console.log(p1 === p2); // true
console.log(p1 === person); // true
console.log(p2 === person); // true

p1.name = 'John'; // change 'name' by 'p1'
p2.lastName = 'Doe'; // change 'lastName' by 'p2'
person.age = 25; // change 'age' by 'person'

// when print 'p1', 'p2' and 'person', it's the same result,
// because the object they points is the same
console.log(p1); // { name: 'John', lastName: 'Doe', age: 25 }
console.log(p2); // { name: 'John', lastName: 'Doe', age: 25 }
console.log(person); // { name: 'John', lastName: 'Doe', age: 25 }

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


বৈকল্পিক 3.1 : ' অবজেক্ট.ক্রিয়েট (ব্যক্তি) '। সাধারণ অবজেক্ট 'ব্যক্তি' দিয়ে অবজেক্ট.ক্রিয়েট ব্যবহার করুন। 'অবজেক্ট.ক্রিয়েট (ব্যক্তি)' নতুন খালি অবজেক্ট তৈরি করবে (এবং প্রত্যাবর্তন করবে) এবং একই নতুন খালি অবজেক্টে '__প্রোট__' সম্পত্তি যুক্ত করবে। এই সম্পত্তি '__ প্রোফাইল__' বস্তুটি 'ব্যক্তি' তে নির্দেশ করবে।

const person = {
        name: 'no name',
        lastName: 'no lastName',
        age: -1,
        getInfo: function getName() {
           return `${this.name} ${this.lastName}, ${this.age}!`;
    }
}

var p1 = Object.create(person);

var p2 = Object.create(person);

// 'p1.__proto__' and 'p2.__proto__' points to
// the same object -> 'person'
// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(p1.__proto__);
console.log(p2.__proto__);
console.log(p1.__proto__ === p2.__proto__); // true

console.log(person.__proto__); // {}(which is the Object.prototype)

// 'person', 'p1' and 'p2' are different
console.log(p1 === person); // false
console.log(p1 === p2); // false
console.log(p2 === person); // false

// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(person);

console.log(p1); // empty object - {}

console.log(p2); // empty object - {}

// add properties to object 'p1'
// (properties with the same names like in object 'person')
p1.name = 'John';
p1.lastName = 'Doe';
p1.age = 25;

// add properties to object 'p2'
// (properties with the same names like in object 'person')
p2.name = 'Tom';
p2.lastName = 'Harrison';
p2.age = 38;

// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(person);

// { name: 'John', lastName: 'Doe', age: 25 }
console.log(p1);

// { name: 'Tom', lastName: 'Harrison', age: 38 }
console.log(p2);

// use by '__proto__'(link from 'p1' to 'person'),
// person's function 'getInfo'
console.log(p1.getInfo()); // John Doe, 25!

// use by '__proto__'(link from 'p2' to 'person'),
// person's function 'getInfo'
console.log(p2.getInfo()); // Tom Harrison, 38!

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


বৈকল্পিক 3.2 : ' অবজেক্ট.ক্রিট (অবজেক্ট.প্রোটোটাইপ) '। বিল্ট-ইন অবজেক্ট -> 'অবজেক্ট.প্রোটোটাইপ' দিয়ে অবজেক্ট.ক্রিট ব্যবহার করুন। 'অবজেক্ট.ক্রিয়েট (অবজেক্ট.প্রোটোটাইপ)' নতুন খালি অবজেক্ট তৈরি করবে (এবং প্রত্যাবর্তন করবে) এবং একই নতুন ফাঁকা বস্তুতে '__প্রোট__' সম্পত্তি যুক্ত করবে। এই সম্পত্তি '__প্রোটো__' 'অবজেক্ট.প্রোটোটাইপ' অবজেক্টটিকে নির্দেশ করবে।

// 'Object.create(Object.prototype)' :
// 1. create and return empty object -> {}.
// 2. add to 'p1' property '__proto__', which is link to 'Object.prototype'
var p1 = Object.create(Object.prototype);

// 'Object.create(Object.prototype)' :
// 1. create and return empty object -> {}.
// 2. add to 'p2' property '__proto__', which is link to 'Object.prototype'
var p2 = Object.create(Object.prototype);

console.log(p1); // {}

console.log(p2); // {}

console.log(p1 === p2); // false

console.log(p1.prototype); // undefined

console.log(p2.prototype); // undefined

console.log(p1.__proto__ === Object.prototype); // true

console.log(p2.__proto__ === Object.prototype); // true

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


ভেরিয়েন্ট 4 : ' নতুন সামার ফাংশন () '

// 'this' in constructor-function 'Person'
// represents a new instace,
// that will be created by 'new Person(...)'
// and returned implicitly
function Person(name, lastName, age) {

    this.name = name;
    this.lastName = lastName;
    this.age = age;

    //-----------------------------------------------------------------
    // !--- only for demonstration ---
    // if add function 'getInfo' into
    // constructor-function 'Person',
    // then all instances will have a copy of the function 'getInfo'!
    //
    // this.getInfo: function getInfo() {
    //  return this.name + " " + this.lastName + ", " + this.age + "!";
    // }
    //-----------------------------------------------------------------
}

// 'Person.prototype' is an empty object
// (before add function 'getInfo')
console.log(Person.prototype); // Person {}

// With 'getInfo' added to 'Person.prototype',
// instances by their properties '__proto__',
// will have access to the function 'getInfo'.
// With this approach, instances not need
// a copy of the function 'getInfo' for every instance.
Person.prototype.getInfo = function getInfo() {
    return this.name + " " + this.lastName + ", " + this.age + "!";
}

// after function 'getInfo' is added to 'Person.prototype'
console.log(Person.prototype); // Person { getInfo: [Function: getInfo] }

// create instance 'p1'
var p1 = new Person('John', 'Doe', 25);

// create instance 'p2'
var p2 = new Person('Tom', 'Harrison', 38);

// Person { name: 'John', lastName: 'Doe', age: 25 }
console.log(p1);

// Person { name: 'Tom', lastName: 'Harrison', age: 38 }
console.log(p2);

// 'p1.__proto__' points to 'Person.prototype'
console.log(p1.__proto__); // Person { getInfo: [Function: getInfo] }

// 'p2.__proto__' points to 'Person.prototype'
console.log(p2.__proto__); // Person { getInfo: [Function: getInfo] }

console.log(p1.__proto__ === p2.__proto__); // true

// 'p1' and 'p2' points to different objects(instaces of 'Person')
console.log(p1 === p2); // false

// 'p1' by its property '__proto__' reaches 'Person.prototype.getInfo' 
// and use 'getInfo' with 'p1'-instance's data
console.log(p1.getInfo()); // John Doe, 25!

// 'p2' by its property '__proto__' reaches 'Person.prototype.getInfo' 
// and use 'getInfo' with 'p2'-instance's data
console.log(p2.getInfo()); // Tom Harrison, 38!

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


চমৎকার সংক্ষিপ্তসার। ধন্যবাদ। এটি আজ আমাকে সাহায্য করেছে !!
আনন্দরাজ_শ্রিনিবাসন

11

অভ্যন্তরীণভাবে এটি Object.createকরে:

Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
};

সিনট্যাক্সটি জাভাস্ক্রিপ্টটি ক্লাসিকাল উত্তরাধিকার ব্যবহার করে এমন মায়া সরিয়ে ফেলে।


25
ইসমাস্ক্রিপ্ট 5 Object.createপদ্ধতিটি এর থেকেও অনেক বেশি কাজ করে, আপনি সম্পত্তি বর্ণনাকারী দ্বারা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে পারেন এবং আপনি এমন কোনও বস্তু তৈরি করতে পারেন যা কোনও কিছুর ( Object.create(null);)) থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয় না , এই ধরণের শিমগুলি এড়ানো উচিত কারণ আপনি সত্যিই অনুকরণ করতে পারবেন না যে ES3 এ আচরণ। আরও তথ্য
সিএমএস

@ সিএমএসের সাথে সম্মত হন তবে সাধারণভাবে এটি এর জন্য সহজ পলিফিল Object.create
ভি। কোভপাক

10

এই উত্তর অনুসারে এবং এই ভিডিও new কীওয়ার্ডটি পরবর্তী কাজগুলি করে:

  1. নতুন অবজেক্ট তৈরি করে।

  2. কনস্ট্রাক্টর ফাংশন ( prototype) এ নতুন অবজেক্টকে লিঙ্ক করে ।

  3. thisনতুন বস্তুর পরিবর্তনশীল পয়েন্ট তৈরি করে ।

  4. নতুন অবজেক্ট এবং অন্তর্নিহিত সম্পাদন ব্যবহার করে কনস্ট্রাক্টর ফাংশন কার্যকর করে return this;

  5. নতুন বস্তুর সম্পত্তিতে কনস্ট্রাক্টর ফাংশন নাম নির্ধারণ করে constructor

Object.createকেবল 1stএবং 2ndপদক্ষেপগুলি সম্পাদন করে !!!

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