জাভাস্ক্রিপ্টে 'নতুন' কীওয়ার্ডটি কী?


1744

newজাভাস্ক্রিপ্ট মধ্যে শব্দ বেশ বিভ্রান্তিকর যখন এটি প্রথম সম্মুখীন করা হয়, মানুষ ভাবতে জাভাস্ক্রিপ্ট একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা নয় ঝোঁক হতে পারে।

  • এটা কি?
  • এটি কোন সমস্যার সমাধান করে?
  • এটি কখন উপযুক্ত এবং কখন নয়?

10
এছাড়াও, সম্পর্কিত থ্রেড - stackoverflow.com/questions/383402/…
চেতন সাস্ট্রি

এই উদাহরণগুলি প্রথম ভাবেন, বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

উত্তর:


2144

এটি 5 টি কাজ করে:

  1. এটি একটি নতুন অবজেক্ট তৈরি করে। এই বস্তুর প্রকারটি কেবল অবজেক্ট
  2. এটি এই নতুন অবজেক্টের অভ্যন্তরীণ, অ্যাক্সেসযোগ্য, [[প্রোটোটাইপ]] (অর্থাৎ __ প্রোফাইল__ ) সম্পত্তিটি কনস্ট্রাক্টর ফাংশনের বহিরাগত, অ্যাক্সেসযোগ্য, প্রোটোটাইপ অবজেক্ট হিসাবে সেট করে (প্রতিটি ফাংশন অবজেক্টে স্বয়ংক্রিয়ভাবে একটি প্রোটোটাইপ সম্পত্তি থাকে)।
  3. এটি thisসদ্য নির্মিত বস্তুর পরিবর্তনশীল পয়েন্ট তৈরি করে।
  4. এটি যখনই thisউল্লেখ করা হয়েছে সদ্য নির্মিত বস্তুটি ব্যবহার করে কনস্ট্রাক্টর ফাংশনটি কার্যকর করে ।
  5. এটি নতুন নির্মিত বস্তুটি ফিরিয়ে দেয়, যদি না কনস্ট্রাক্টর ফাংশন একটি অ- nullঅবজেক্ট রেফারেন্স দেয়। এই ক্ষেত্রে, সেই বস্তুর রেফারেন্স পরিবর্তে ফিরে আসে।

নোট: কন্সট্রাকটর ফাংশন পর ফাংশন বোঝায় newহিসাবে, শব্দ

new ConstructorFunction(arg1, arg2)

এটি হয়ে গেলে, নতুন বস্তুর কোনও অপরিজ্ঞাত সম্পত্তি অনুরোধ করা হলে স্ক্রিপ্টটি পরিবর্তে সম্পত্তিটির জন্য বস্তুর [[প্রোটোটাইপ]] অবজেক্টটি পরীক্ষা করবে । এইভাবে আপনি জাভাস্ক্রিপ্টে traditionalতিহ্যবাহী শ্রেণীর উত্তরাধিকারের মতো কিছু পেতে পারেন।

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

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


এখানে একটি উদাহরণ:

ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes 
// it a constructor.

ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that 
// we can alter. I just added a property called 'b' to it. Like 
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with

obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1.  At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.

obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks 
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'

এটি শ্রেণীর উত্তরাধিকারের মতো কারণ এখন আপনি যে কোনও বস্তু ব্যবহার করে new ObjMaker()তা 'বি' সম্পত্তি উত্তরাধিকার সূত্রে প্রাপ্ত বলে মনে হবে।

আপনি যদি সাবক্লাসের মতো কিছু চান তবে আপনি এটি করুন:

SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);

SubObjMaker.prototype.c = 'third';  
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype

obj2.c;
// returns 'third', from SubObjMaker.prototype

obj2.b;
// returns 'second', from ObjMaker.prototype

obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 
// was created with the ObjMaker function, which assigned a for us

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


47
কেবল যুক্ত করতে চেয়েছিলেন: প্রকৃতপক্ষে অভ্যন্তরীণ [[প্রোটোটাইপ]] অ্যাক্সেস করার একটি উপায় আছে __প্রাইটো__ দ্বারা। এটি তবে মান -হীন, এবং কেবল অপেক্ষাকৃত নতুন ব্রাউজারগুলির দ্বারা সমর্থিত (এবং তাদের সবগুলিই নয়)। অবজেক্ট.জেটপ্রোটোটাইপ অফ (ওজেক্ট) নামে একটি স্ট্যান্ডার্ডাইজড উপায় আসছে, তবে এটি একমাস্ক্রিপ্ট ৩.১, এবং নিজেই কেবল নতুন ব্রাউজারগুলিতে সমর্থিত - আবার again সাধারণত সেই সম্পত্তিটি ব্যবহার না করার জন্য সুপারিশ করা হয় যদিও স্টাফগুলি সেখানে ভিতরে প্রকৃত দ্রুত জটিল হয়ে ওঠে।
ব্লব

9
প্রশ্ন: যদি ObjMakerকোনও ফাংশন সংজ্ঞা দেওয়া হয় যা কোনও মান দেয়?
জিম ব্ল্যাকার

13
@ লোনলিপিক্সেল newউপস্থিত রয়েছে যাতে আপনাকে ফাংশন / অবজেক্টগুলি তৈরি / অনুলিপি করার জন্য কারখানার পদ্ধতিগুলি লিখতে না হয় । এর অর্থ, "এটিকে অনুলিপি করুন, একে একে তার পিতামাতার 'শ্রেণির' মতো করে; দক্ষতার সাথে এবং সঠিকভাবে করুন; এবং উত্তরাধিকারের তথ্য সংরক্ষণ করুন যা কেবলমাত্র আমার কাছে জেএস, অভ্যন্তরীণভাবে অ্যাক্সেসযোগ্য। এটি করার জন্য, এটি prototypeউত্তরাধিকারী সদস্যদের স্বচ্ছভাবে encapsulate করতে ক্লাসিকাল OO উত্তরাধিকার শৃঙ্খলা (যা রানটাইম পরিবর্তনযোগ্য নয়) নকল করে নতুন বস্তুর অন্যথায় দুর্গম অভ্যন্তরীণ পরিবর্তন করে। আপনি এটি ছাড়া এটি অনুকরণ করতে পারেন new, তবে উত্তরাধিকারটি রানটাইম পরিবর্তনযোগ্য হবে। ভাল? খারাপ? আপনার উপর
ইঞ্জিনিয়ার

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

7
একটি নোট আছে যে বলে Notice that this pattern is deprecated!। কোন শ্রেণীর প্রোটোটাইপ সেট করতে সঠিক আপ টু ডেট প্যাটার্নটি কী?
টম পাউরেক

400

ধরুন আপনার এই ফাংশনটি রয়েছে:

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

আপনি যদি এটির মতো স্ট্যান্ড্যালোন ফাংশন হিসাবে ডাকে:

Foo();

এই ফাংশনটি সম্পাদন করলে windowবস্তুর ( Aএবং B) দুটি বৈশিষ্ট্য যুক্ত হবে । এটি এটিকে যুক্ত করে windowকারণ windowএটি এমন একটি বস্তু যা ফাংশন বলে যখন আপনি এটির মতো এটি thisসম্পাদন করেন এবং কোনও ফাংশনে সেই অবজেক্টকে ফাংশন বলে। অন্তত জাভাস্ক্রিপ্টে।

এখন, এটির সাথে এটি কল করুন new:

var bar = new Foo();

আপনি যখন newকোনও ফাংশন কলে যুক্ত করবেন তখন যা ঘটেছিল তা হ'ল একটি নতুন অবজেক্ট তৈরি করা হয়েছে (জাস্ট var bar = new Object()) এবং thisফাংশনটির ভিতরে থাকাটি Objectসবেমাত্র তৈরি করা নতুনটির দিকে ইঙ্গিত করে যা ফাংশন নামে পরিচিত বস্তুর পরিবর্তে। সুতরাং barএখন বৈশিষ্ট্য Aএবং একটি বস্তু হয় B। যে কোনও ক্রিয়াকলাপ একজন নির্মাতা হতে পারে, এটি সর্বদা বুদ্ধিমান হয় না।


7
কার্যকর করা প্রসঙ্গে নির্ভর করে। আমার ক্ষেত্রে (Qt স্ক্রিপ্টিং) এটি কেবল একটি বিশ্বব্যাপী অবজেক্ট।
ম্যাক্সিম

2
এটি কি আরও মেমরির ব্যবহারের কারণ ঘটবে?
জর্জেন পল 19

2
কারণ উইন্ডো হ'ল অবজেক্ট যা ফাংশন বলে - অবশ্যই হওয়া উচিত: কারণ উইন্ডো হ'ল সেই বস্তু যা ফাংশন ধারণ করে।
ডেভিড হরভথ

1
@ টিউরাস একটি ওয়েব ব্রাউজারে একটি নন-মেথড ফাংশন হবে স্পষ্টতই একটি পদ্ধতি window। এমনকি বন্ধ থাকলেও নামবিহীন। তবে, উদাহরণস্বরূপ এটি উইন্ডোতে একটি সহজ পদ্ধতি অনুরোধ: Foo();=> [default context].Foo();=> window.Foo();। এই এক্সপ্রেশনে windowহয় প্রেক্ষাপটে (না শুধুমাত্র আহ্বানকারী , যা কোন ব্যাপার না)।
ডেভিড হোর্ভাথ

1
@ ট্যরাস মূলত হ্যাঁ তবে ইসিএমএ 6 এবং 7-তে জিনিসগুলি আরও জটিল (ল্যাম্বডাস, ক্লাস ইত্যাদি দেখুন)।
ডেভিড হোর্ভাথ

164

ড্যানিয়েল হাওয়ার্ডের উত্তর ছাড়াও, এখানে যা newহয় (বা কমপক্ষে মনে হয়):

function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}

যদিও

var obj = New(A, 1, 2);

সমতুল্য

var obj = new A(1, 2);

73
আমি দেখতে পেয়েছি যে জাভাস্ক্রিপ্টটি
ইংরাজির

দুর্দান্ত উত্তর। আমার একটি ছোট প্রশ্ন আছে: এটি কীভাবে সম্ভব func.prototypeহবে null? আপনি কি দয়া করে কিছুটা ব্যাখ্যা করতে পারেন?
টম পাউরেক

6
@ টমপ আপনি প্রোটোটাইপ সম্পত্তি ওভাররাইড করতে পারবেন, কেবল লেখার মাধ্যমে A.prototype = null;সেই ক্ষেত্রে new A()বস্তুর ফলস্বরূপ, অভ্যন্তরের অভ্যন্তরীণ প্রোটোটাইপটি পয়েন্টটি নির্দেশ করবে Object: jsfiddle.net/Mk42Z
বেসিলিকুম

2
টাইপফোন চেকটি ভুল হতে পারে কারণ একটি হোস্ট অবজেক্ট "অবজেক্ট" বা "ফাংশন" থেকে আলাদা কিছু তৈরি করতে পারে। কিছু যদি কোনও বস্তু হয় তা পরীক্ষা করতে আমি পছন্দ করি Object(ret) === ret
ওরিওল

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

109

প্রাথমিকভাবে এটি আরও ভালভাবে বুঝতে

ব্রাউজার কনসোলে নিম্নলিখিত কোডটি ব্যবহার করে দেখুন।

function Foo() { 
    return this; 
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

a instanceof Window;  // true
a instanceof Foo;     // false

b instanceof Window;  // false
b instanceof Foo;     // true

এখন আপনি সম্প্রদায়টির উইকি উত্তরটি পড়তে পারেন :)


4
ভাল উত্তর. এছাড়াও - রেখে যাওয়া return this;একই ফলন দেয়।
নেলু

37

সুতরাং এটি সম্ভবত অবজেক্টের উদাহরণ তৈরি করার জন্য নয়

এটি ঠিক এটির জন্য ব্যবহার করা হয়েছে। আপনি যেমন একটি ফাংশন নির্মাণকারী সংজ্ঞায়িত:

function Person(name) {
    this.name = name;
}

var john = new Person('John');

তবে ECMAScript এর অতিরিক্ত সুবিধাটি হ'ল আপনি .prototypeসম্পত্তিটির সাথে প্রসারিত করতে পারেন , তাই আমরা এর মতো কিছু করতে পারি ...

Person.prototype.getName = function() { return this.name; }

এই কন্সট্রাক্টর থেকে তৈরি সমস্ত অবজেক্টের getNameপ্রোটোটাইপ চেইনের কারণে তাদের অ্যাক্সেস রয়েছে।


6
ফাংশন কনস্ট্রাক্টরগুলি ক্লাসগুলির মতো ব্যবহৃত হয়, কোনও classকীওয়ার্ড নেই তবে আপনি একই জিনিসটি করতে পারেন।
মধ্যস্থতা ওমুরিলিভ

কিন্ডোফের একটি শ্রেণির কীওয়ার্ড রয়েছে - ক্লাসটি ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত রয়েছে
গ্রেগ

11
ঘটনাক্রমে সে কারণেই আপনি। ক্লাসের নাম ব্যবহার করেন না। ক্লাস একটি সিএসএস ক্লাস সেট করতে নয়
গ্রেগ

23
এটি কনভেনশন দ্বারা ব্যক্তি মূলধন করা উচিত।
ইওমারেফ

27

জাভাস্ক্রিপ্ট হ'ল একটি অবজেক্ট-ভিত্তিক প্রোগ্রামিং ভাষা এবং এটি দৃষ্টান্ত তৈরির জন্য সঠিকভাবে ব্যবহৃত হয়। এটি শ্রেণিবদ্ধের চেয়ে প্রোটোটাইপ-ভিত্তিক, তবে এর অর্থ এই নয় যে এটি বস্তু-ভিত্তিক নয়।


6
আমি বলতে চাই যে জাভাস্ক্রিপ্টটি class সমস্ত শ্রেণিভিত্তিক ভাষার চেয়ে আরও বেশি বস্তু-কেন্দ্রিক বলে মনে হচ্ছে। জাভাস্ক্রিপ্টে আপনি যা কিছু লিখেছেন তা অবিলম্বে একটি বস্তুতে পরিণত হয় তবে ক্লাস-ভিত্তিক ভাষাগুলিতে আপনি প্রথমে ঘোষণা লিখেন এবং কেবলমাত্র পরে আপনি ক্লাসের নির্দিষ্ট উদাহরণ (অবজেক্ট) তৈরি করেন। এবং জাভাস্ক্রিপ্ট প্রোটোটাইপটি ক্লাস-ভিত্তিক ভাষার জন্য সমস্ত VTABLE স্টাফকে অস্পষ্টভাবে মনে করিয়ে দেয়।
জাস্টামার্টিন

14

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

ক্লাস অবজেক্টগুলির জন্য প্রয়োজনীয় নয় - জাভাস্ক্রিপ্ট একটি প্রোটোটাইপ ভিত্তিক ভাষা।


12

ইতিমধ্যে কিছু খুব দুর্দান্ত উত্তর রয়েছে তবে নীচে তৃতীয় ক্ষেত্রে আমার পর্যবেক্ষণের উপর জোর দেওয়ার জন্য আমি একটি নতুন পোস্ট করছি যা যখন আপনি কোনও ফাংশনে সুস্পষ্ট রিটার্নের বিবৃতি পাবেন তখন কী ঘটে new। নীচের ক্ষেত্রে একবার দেখুন:

কেস আই :

var Foo = function(){
  this.A = 1; 
  this.B = 2;
};
console.log(Foo()); //prints undefined
console.log(window.A); //prints 1

উপরেরটি দ্বারা চিহ্নিত অনামী ফাংশনটিকে কল করার একটি সরল মামলা Foo। আপনি যখন এই ফাংশনটি কল করবেন তখন এটি ফিরে আসে undefined। যেহেতু স্পষ্টরূপে কোনও রিটার্ন বিবৃতি নেই তাই জাভাস্ক্রিপ্ট ইন্টারপ্রেটার জোর return undefined;করে ফাংশন শেষে একটি বিবৃতি .োকান । এখানে উইন্ডোটি হ'ল অনুরোধ বস্তু (প্রাসঙ্গিক this) যা নতুন Aএবং Bবৈশিষ্ট্যগুলি পায় ।

কেস II :

var Foo = function(){
  this.A = 1;
  this.B = 2;
};
var bar = new Foo();
console.log(bar()); //illegal isn't pointing to a function but an object
console.log(bar.A); //prints 1

এখানে জাভাস্ক্রিপ্ট ইন্টারপ্রেটার newকীওয়ার্ডটি দেখলে একটি নতুন অবজেক্ট তৈরি করে যা thisদ্বারা চিহ্নিত বেনামে ফাংশনটির আহ্বান অবজেক্ট (প্রাসঙ্গিক ) হিসাবে কাজ করে Foo। এই ক্ষেত্রে Aএবং Bসদ্য নির্মিত বস্তুর (উইন্ডো অবজেক্টের জায়গায়) বৈশিষ্ট্য হয়ে উঠুন। যেহেতু আপনার কোনও সুস্পষ্ট রিটার্ন বিবৃতি নেই তাই জাভাস্ক্রিপ্ট ইন্টারপ্রেটার newকীওয়ার্ডের ব্যবহারের কারণে তৈরি হওয়া নতুন অবজেক্টটিকে জোর করে একটি রিটার্ন স্টেটমেন্ট সন্নিবেশ করান ।

কেস III :

var Foo = function(){
  this.A = 1;
  this.B = 2;
  return {C:20,D:30}; 
};
var bar = new Foo();
console.log(bar.C);//prints 20
console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.

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

তৃতীয় ক্ষেত্রে খেয়াল করার বিষয়টি হ'ল newকীওয়ার্ডের কারণে তৈরি হওয়া অবজেক্টটি আপনার রাডার থেকে হারিয়ে গেছে। barআসলে একটি সম্পূর্ণ পৃথক বস্তুর দিকে ইঙ্গিত করছে যা newকীওয়ার্ডের কারণে জাভাস্ক্রিপ্ট ইন্টারপ্রেটার তৈরি করেছে তা নয় ।

জাভাস্ক্রিপ্ট থেকে ডেভিড ফ্লানাগনের উদ্ধৃতি: সংজ্ঞা গাইড (6th ষ্ঠ সংস্করণ), সিএইচ। 4, পৃষ্ঠা # 62:

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

--- অতিরিক্ত তথ্য ---

উপরের মামলার কোড স্নিপেটে ব্যবহৃত ফাংশনগুলির নীচে যেমন জেএস বিশ্বে বিশেষ নাম রয়েছে:

কেস I এবং II - কনস্ট্রাক্টর ফাংশন

কেস III - কারখানার কার্যকারিতা। কার্টরি ফাংশনগুলি কীওয়ার্ডের সাথে ব্যবহার করা উচিত নয়new যা আমি বর্তমান থ্রেডে ধারণাটি ব্যাখ্যা করতে পেরেছি।

আপনি এই থ্রেডে তাদের মধ্যে পার্থক্য সম্পর্কে পড়তে পারেন ।


আপনার কেস 3, একটি গ্র 8 পর্যবেক্ষণ
অ্যাপু

5

কখনও কখনও কোড শব্দের চেয়ে সহজ:

var func1 = function (x) { this.x = x; }                    // used with 'new' only
var func2 = function (x) { var z={}; z.x = x; return z; }   // used both ways
func1.prototype.y = 11;
func2.prototype.y = 12;

A1 = new func1(1);      // has A1.x  AND  A1.y
A2 =     func1(1);      // undefined ('this' refers to 'window')
B1 = new func2(2);      // has B1.x  ONLY
B2 =     func2(2);      // has B2.x  ONLY

আমার পক্ষে, যতক্ষণ না আমি প্রোটোটাইপ না করি, ততক্ষণ আমি ফান 2 এর স্টাইল ব্যবহার করি কারণ এটি আমাকে ফাংশনের ভিতরে এবং বাইরে কিছুটা নমনীয়তা দেয়।


3
B1 = new func2(2); <- কেন হবে না B1.y ?
রৌদ্র_দেব

@sunny_dev আমি জাতীয় বিশেষজ্ঞ নই, কিন্তু সম্ভবত কারণ func2 সরাসরি একটি মান (z- র বস্তুর) ফিরে না, পরিবর্তে কাজ / (এই) অভ্যন্তরীণ মান ফিরে
ঈগল

5

newশব্দ প্রেক্ষাপটে যার অধীনে ফাংশন চালানো হচ্ছে পরিবর্তন আর এ প্রসঙ্গে একটি পয়েন্টার ফেরৎ।

আপনি যখন newকীওয়ার্ডটি ব্যবহার করবেন না , তখন যে ফাংশনটির অধীনে ফাংশনটি Vehicle()চালিত হয় সেই প্রসঙ্গটি একই প্রসঙ্গটি থেকে আপনি Vehicleফাংশনটি কল করছেন । মূল thisশব্দটি একই প্রসঙ্গে পড়বে। আপনি যখন ব্যবহার করবেন তখন new Vehicle()একটি নতুন প্রসঙ্গ তৈরি করা হবে যাতে thisফাংশনের ভিতরে কীওয়ার্ডটি নতুন প্রসঙ্গকে বোঝায়। বিনিময়ে আপনি যা পান তা হ'ল নতুন তৈরি প্রসঙ্গ।


সুযোগের দিক থেকে এটি খুব অন্তর্দৃষ্টিযুক্ত উত্তর। উত্তর 8 যোগ করুন।
অপু

3

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

obj = new Element();

2

সারসংক্ষেপ:

newশব্দ একটি কন্সট্রাকটর ফাংশন থেকে একটি বস্তু তৈরি করতে দয়া করে জাভাস্ক্রিপ্ট ব্যবহার করা হয়। newশব্দ সামনে কন্সট্রাকটর ফাংশন কল স্থাপন করা হবে এবং নিম্নোক্ত যে কি হবে:

  1. একটি নতুন অবজেক্ট তৈরি করে
  2. এই বস্তুর প্রোটোটাইপটি কনস্ট্রাক্টর ফাংশনের প্রোটোটাইপ বৈশিষ্ট্যে সেট করে
  3. thisনতুন তৈরি হওয়া অবজেক্টটিতে কীওয়ার্ডকে আবদ্ধ করে এবং কনস্ট্রাক্টর ফাংশনটি কার্যকর করে
  4. সদ্য নির্মিত বস্তুটি ফিরিয়ে দেয়

উদাহরণ:

function Dog (age) {
  this.age = age;
}

const doggie = new Dog(12);

console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true

ঠিক কী ঘটে:

  1. const doggie বলেছেন: ভেরিয়েবল ঘোষণার জন্য আমাদের স্মৃতি দরকার।
  2. অ্যাসিগমেন্ট অপারেটর =বলেছেন: আমরা এই ভেরিয়েবলটি এর পরে এক্সপ্রেশন দিয়ে শুরু করতে যাচ্ছি=
  3. এক্সপ্রেশন হয় new Dog(12)। জেএস ইঞ্জিনটি নতুন কীওয়ার্ডটি দেখে, একটি নতুন অবজেক্ট তৈরি করে এবং প্রোটোটাইপটিকে ডগ.প্রোটোটাইপ সেট করে
  4. কনস্ট্রাক্টর ফাংশনটি thisনতুন অবজেক্টে মান সেট করে নির্বাহ করা হয় । এই পদক্ষেপে যেখানে বয়সটি তৈরি করা হয়েছে নতুন তৈরি কুকি অবজেক্টকে।
  5. সদ্য নির্মিত বস্তুটি ফিরিয়ে আনা হয় এবং ভেরিয়েবল কুকুরের জন্য বরাদ্দ করা হয়।

1

newশব্দ একটি কন্সট্রাকটর যেমন ফাংশন ব্যবহার করে বস্তুর দৃষ্টান্ত সৃষ্টি করে। এই ক্ষেত্রে:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

উদাহরণগুলি prototypeকনস্ট্রাক্টর ফাংশন থেকে উত্তরাধিকার সূত্রে প্রাপ্ত । সুতরাং উপরের উদাহরণ দেওয়া ...

foo.bar; // 'bar'

2
নতুন কীওয়ার্ডটি ইতিমধ্যে কনস্ট্রাক্টর হিসাবে ফাংশনটি সংযুক্ত করে; আপনার কিছু ফেরত দেওয়ার দরকার নেই। আপনি কেবল এটি করতে পারেন: ফাংশন foo (x)। This.bar = x; obj var obj = নতুন ফু (10); সতর্কতা (obj.bar);
reko_t

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

ঠিক আছে, এটি একটি উদাহরণ ছিল। আপনি কোনও জিনিস ফেরত দিতে পারেন। এই দৃশ্যে অনেকগুলি নিদর্শন ব্যবহৃত হয়েছে, আমি একটি "উদাহরণস্বরূপ" হিসাবে সরবরাহ করেছি, সুতরাং আমার শব্দগুলি "উদাহরণস্বরূপ"।
চোখের পাতা 21

1

ওয়েল জাভা স্ক্রিপ্ট প্রতি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের থেকে আলাদা হতে পারে কারণ এটি সর্বদা মূল স্পেসিফিকেশন ইকামাস্ক্রিপ্টের প্রয়োগ implementation

যে কোনও ক্ষেত্রে, স্বাধীনভাবে বাস্তবে প্রয়োগের সমস্ত জাভাস্ক্রিপ্ট বাস্তবায়ন যা ইকামাস্ক্রিপ্টের বিশদটি সঠিকভাবে অনুসরণ করে, আপনাকে একটি অবজেক্ট ওরিয়েন্টেড ভাষা দেবে। ES মান অনুযায়ী:

ইস্কামস্ক্রিপ্ট একটি হোস্ট এনভায়রনমেন্টের মধ্যে গণনা সম্পাদন এবং গণনামূলক অবজেক্টগুলি পরিচালনা করার জন্য একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজ।

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

ইকামাস্ক্রিপ্টে আমরা ক্লাস ব্যবহার করি না, যেমন আপনি চশমা থেকে পড়তে পারেন:

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

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