আমার কি অবজেক্ট লিটারাল বা কনস্ট্রাক্টর ফাংশন ব্যবহার করা উচিত?


94

জাভাস্ক্রিপ্টে আমার কোন অবজেক্ট তৈরি করা উচিত তা নিয়ে আমি বিভ্রান্ত হয়ে পড়ছি। মনে হয় কমপক্ষে দুটি উপায় রয়েছে। একটি হ'ল অবজেক্ট আক্ষরিক স্বরলিপি ব্যবহার করা হয় অন্যটি নির্মাণকাজগুলি ব্যবহার করে। একে অপরের ওপরে কি সুবিধা আছে?


4
সেরা উত্তর: স্ট্যাকওভারফ্লো / প্রশ্ন / 4597926/… - সংক্ষেপে, আপনি উদাহরণস্বরূপ আক্ষরিক স্বরলিপি তৈরির জন্য একটি ফাংশন সেট আপ করতে পারেন। এটি প্রতিটি ক্ষেত্রে করা সমস্ত পদ্ধতি বহন করে, যেখানে কনস্ট্রাক্টরের সাথে সমস্ত উদাহরণ প্রোটোটাইপ পদ্ধতিগুলি বোঝায়। আই কনস্ট্রাক্টরের মেমরির পারফরম্যান্স আরও ভাল।
ফেডেরিকো

মেমোরি যদি কোনও সমস্যা না হয় তবে আক্ষরিক
ড্যানিয়েল

উত্তর:


131

যদি আপনার কোনও অবজেক্টের সাথে সম্পর্কিত আচরণ না হয় (অর্থাত্ যদি বস্তুটি কেবলমাত্র ডেটা / স্টেটের জন্য ধারক হয়), তবে আমি একটি বস্তুকে আক্ষরিক ব্যবহার করব।

var data = {
    foo: 42,
    bar: 43
};

KISS নীতি প্রয়োগ করুন । আপনার যদি কোনও সাধারণ ধারকের উপাত্তের বাইরে কিছু না প্রয়োজন হয় তবে সাধারণ আক্ষরিক সাথে যান।

আপনি যদি নিজের অবজেক্টের সাথে আচরণ যুক্ত করতে চান তবে আপনি কনস্ট্রাক্টরের সাথে যেতে পারেন এবং নির্মাণের সময় অবজেক্টটিতে পদ্ধতি যুক্ত করতে পারেন বা আপনার শ্রেণিকে একটি প্রোটোটাইপ দিতে পারেন।

function MyData(foo, bar) {
    this.foo = foo;
    this.bar = bar;

    this.verify = function () {
        return this.foo === this.bar;
    };
}

// or:
MyData.prototype.verify = function () {
    return this.foo === this.bar;
};

এর মতো শ্রেণিটিও আপনার ডেটা অবজেক্টের জন্য স্কিমার মতো কাজ করে: আপনার কাছে এখন কিছু ধরণের চুক্তি রয়েছে (কনস্ট্রাক্টরের মাধ্যমে) অবজেক্টটি কী কী বৈশিষ্ট্য শুরু করে / রাখে তা। একটি নিখরচায় আক্ষরিক কেবল একটি নিরাকার ডাটা blo

আপনার পাশাপাশি কোনও বহিরাগত verifyফাংশন থাকতে পারে যা একটি সরল পুরানো ডেটা অবজেক্টে কাজ করে:

var data = {
    foo: 42,
    bar: 43
};

function verify(data) {
    return data.foo === data.bar;
}

তবে এটি এনক্যাপসুলেশনের ক্ষেত্রে অনুকূল নয়: আদর্শভাবে, সত্তার সাথে সম্পর্কিত সমস্ত ডেটা + আচরণ একসাথে থাকতে হবে।


12
দুর্দান্ত ব্যাখ্যা, তবে কোনও বস্তুর আক্ষরিক ক্ষেত্রে ফাংশন রাখার কী? আমি এর আগেও এটি দেখেছি। আসলে নীচের পোস্টে এর একটি উদাহরণ রয়েছে।
চাবো

23
আপনি যদি বস্তুর আক্ষরিক অংশ হিসাবে ফাংশন সংজ্ঞাগুলি অন্তর্ভুক্ত করেন, বা this.fn = function ...কোনও কনস্ট্রাক্টরের মধ্যে পদ্ধতির ব্যবহার করেন তবে আপনার প্রতিটি বস্তুর উদাহরণগুলির নিজস্ব ফাংশনগুলির অনুলিপি থাকবে। প্রোটোটাইপ পদ্ধতির ব্যবহার করে আপনি প্রতিটি ফাংশন একবারে এবং একবারে সংযুক্ত করেন: প্রোটোটাইপাল উত্তরাধিকারের মাধ্যমে সেগুলি দৃষ্টান্তগুলির মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হবে।
এটস গোলাল

14
আমি বিশ্বাস করি আপনি একটি গুরুত্বপূর্ণ জিনিস মিস করেছেন। শুধুমাত্র কনস্ট্রাক্টর ফাংশন ব্যক্তিগত সদস্যদের পাশাপাশি পাবলিক সদস্য (এনক্যাপসুলেশন) সরবরাহ করতে পারে provide আক্ষরিক বস্তুতে - এগুলি সমস্ত প্রকাশ্য।
রই নমির

গেম ইঞ্জিনে যাওয়ার আরও ভাল উপায় কী হতে পারে? আমি কনস্ট্রাক্টর পদ্ধতিটি ব্যবহার করেছি তবে আমার প্রোটোটাইপগুলিতে কনস্ট্রাক্টরের ডেটা অ্যাক্সেস নেই।
zachdyer

90

এটি আপনার মূল অবজেক্টের একাধিক উদাহরণ প্রয়োজন কিনা তা মূলত ফোটে; কনস্ট্রাক্টরের সাথে সংজ্ঞায়িত অবজেক্ট আপনাকে সেই অবজেক্টের একাধিক ইনস্ট্যান্স করতে দেয়। অবজেক্ট লিটারালগুলি মূলত ভেরিয়েবল / পদ্ধতিগুলির সাথে একক যা সমস্ত পাবলিক।

// define the objects:
var objLit = {
  x: 0,
  y: 0,
  z: 0,
  add: function () {
    return this.x + this.y + this.z;
  }
};

var ObjCon = function(_x, _y, _z) {
  var x = _x; // private
  var y = _y; // private
  this.z = _z; // public
  this.add = function () {
    return x + y + this.z; // note x, y doesn't need this.
  };
};

// use the objects:
objLit.x = 3; 
objLit.y = 2; 
objLit.z = 1; 
console.log(objLit.add());    

var objConIntance = new ObjCon(5,4,3); // instantiate an objCon
console.log(objConIntance.add());
console.log((new ObjCon(7,8,9)).add()); // another instance of objCon
console.log(objConIntance.add()); // same result, not affected by previous line

4
সিদ্ধান্ত নেওয়ার সময় মাথায় রাখতে এটি একটি খুব ভাল বিষয়। ধন্যবাদ.
zkent

আমার অভিজ্ঞতায় ঠিক এটাই পার্থক্য তৈরি করে। দুর্দান্ত স্পষ্ট উদাহরণ।
এয়ার

9

অভিন্ন উপায়ে অবজেক্ট তৈরির আর একটি উপায় হ'ল কোনও ফাংশন ব্যবহার করা যা কোনও বস্তুকে রিটার্ন দেয়:

function makeObject() {
    var that = {
        thisIsPublic: "a public variable"
        thisIsAlsoPublic: function () {
            alert(that.thisIsPublic);
        }
    };

    var secret = "this is a private variable"

    function secretFunction() { // private method
        secret += "!"; // can manipulate private variables
        that.thisIsPublic = "foo";     
    }

    that.publicMethod = function () {
        secret += "?"; // this method can also mess with private variables
    }

    that.anotherPublicVariable = "baz";

    return that; // this is the object we've constructed
}

makeObject.static = "This can be used to add a static varaible/method";

var bar = makeObject();
bar.publicMethod(); // ok
alert(bar.thisIsPublic); // ok
bar.secretFunction(); // error!
bar.secret // error!

জাভাস্ক্রিপ্টের ফাংশনগুলি ক্লোজার হওয়ার কারণে আমরা ব্যক্তিগত ভেরিয়েবল এবং পদ্ধতিগুলি ব্যবহার করতে পারি এবং এড়াতে পারি new

জাভাস্ক্রিপ্টে ব্যক্তিগত ভেরিয়েবলের জন্য http://javascript.crockford.com/private.html থেকে ।


7

নীচের কোডটিতে একটি অবজেক্ট তৈরির তিনটি পদ্ধতি, অবজেক্ট লিটারাল সিনট্যাক্স, একটি ফাংশন কনস্ট্রাক্টর এবং Object.create()। অবজেক্ট আক্ষরিক বাক্য গঠনটি কেবল ফ্লাইতে তৈরি করে এবং বস্তু তৈরি করে এবং __prototype__যেমন এটি Objectবস্তু এবং এটির সমস্ত বৈশিষ্ট্য এবং পদ্ধতিতে এটির অ্যাক্সেস থাকবে Object। কঠোরভাবে ডিজাইনের প্যাটার্ন দৃষ্টিকোণ থেকে একটি সাধারণ অবজেক্ট আক্ষরিক ব্যবহার করা উচিত ডেটাগুলির একক দৃষ্টান্ত সংরক্ষণ করার জন্য।

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

অবজেক্টের তৈরি করা হচ্ছে Object.create()সদ্ব্যবহার হিসেবে একটি বস্তু আক্ষরিক __prototype__এই পদ্ধতি দ্বারা নির্মিত অবজেক্টের জন্য। আক্ষরিক বস্তুতে যুক্ত সমস্ত বৈশিষ্ট্য এবং পদ্ধতিগুলি সত্য প্রোটোটাইপাল উত্তরাধিকারের মাধ্যমে এটি থেকে তৈরি সমস্ত বস্তুর জন্য উপলব্ধ থাকবে। এটি আমার পছন্দের পদ্ধতি।

//Object Example

//Simple Object Literal
var mySimpleObj = {
    prop1 : "value",
    prop2 : "value"
}

// Function Constructor
function PersonObjConstr()  {
    var privateProp = "this is private";
    this.firstname = "John";
    this.lastname = "Doe";
}
PersonObjConstr.prototype.greetFullName = function()    {
    return "PersonObjConstr says: Hello " + this.firstname + 
    " " + this.lastname;
};

// Object Literal
var personObjLit = {
    firstname : "John",
    lastname: "Doe",
    greetFullName : function() {
        return "personObjLit says: Hello " + this.firstname +
        ", " + this.lastname;
    }
} 

var newVar = mySimpleObj.prop1;
var newName = new PersonObjConstr();
var newName2 = Object.create(personObjLit);

4
যেহেতু আপনি কোনও বস্তুর অভ্যন্তরে ফাংশনটি আক্ষরিক হিসাবে ঘোষণা করেছেন। এর অর্থ কি যখন আপনি Object.createআক্ষরিক অভ্যন্তরে ফাংশনটি ব্যবহার করে কোনও বস্তু তৈরি করেন প্রতি উদাহরণে অনন্য হয়ে যাবে?
জননিকিউ

6

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

function SomeConstructor(){
    var x = 5;
    this.multiply5 = function(i){
        return x*i;
    }
}
var myObj = new SomeConstructor;

var SomeLiteral = {
    multiply5: function(i){ return i*5; }
}

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


একটি ফাংশন এবং একটি পদ্ধতির মধ্যে পার্থক্য কী? আমি এসি # ব্যাকগ্রাউন্ড থেকে এসেছি তাই আমার কাছে একটি ফাংশনটি স্বতন্ত্র এবং একটি পদ্ধতি কেবল একটি ফাংশন যা শ্রেণীর অংশ।
চাবো

4
খুব বেশি পার্থক্য নেই, উদাহরণস্বরূপ ওয়েব- সোর্স ডটকম / জাভাস্ক্রিপ্ট_ট্যোরিয়াল / দেখুন । আসলে, DOMscripting (ক ব্রাউজারে ক্লায়েন্ট সাইড JS) এ, সব ফাংশন উইন্ডো-বস্তু (বিশ্বব্যাপী নামস্থান) আমি বলতে হবে (আপনি উইন্ডো হিসাবে সব 'স্বতন্ত্র' ফাংশন সুরাহা করতে পারেন পদ্ধতি হন
KooiInc

5

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

আপনি কি পৃষ্ঠার জন্য একক উদাহরণ চান - ল্যাটারাল।

আপনি কি কেবল ডিটিও অবজেক্টের মতো ডেটা স্থানান্তর করতে চান সহজ জিইটি সেট: - আক্ষরিক

আপনি কি পদ্ধতির আচরণ, একাধিক দৃষ্টান্ত সহ প্রকৃত অবজেক্ট তৈরি করতে চান - কনস্ট্রাক্টর ফাংশন, ওওপি নীতি অনুসরণ করুন, উত্তরাধিকার: - কনস্ট্রাক্টর ফাংশন।

নীচে ইউটিউব ভিডিওতে যা বিশদভাবে ব্যাখ্যা করেছে যা আক্ষরিক তা কী, নির্মাণকারীর কার্য কী এবং কীভাবে তারা একে অপরের থেকে পৃথক।

https://www.youtube.com/watch?v=dVoAq2D3n44


1

আক্ষরিক অবজেক্টের সাথে যান, এটি প্রাথমিক মূল্যবোধের প্রবর্তনের সাথে আরও কনসাইজ এবং প্রসারিত হয়।


আক্ষরিক অর্থে আপনি কীভাবে ব্যক্তিগত ভেরিয়েবল তৈরি করবেন?
এহেভটোভ

আপনি সত্যিই পারবেন না, এটি মূল প্রশ্নের সাথে প্রাসঙ্গিক নয় সুতরাং আমি আপনাকে কেবল একটি লিঙ্ক দিতে যাচ্ছি: javascript.crockford.com/private.html
টম

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

আমি সংশোধন হয়ে দাঁড়িয়েছি, আমার প্রশ্নের মূল পাঠটি ছিল যে চোবো কীভাবে কনস্ট্রাক্টরে ভেরিয়েবলগুলি পাসওয়ার্ডের তালিকায় বনাম একক বস্তুর আক্ষরিক পরামিতি সম্পর্কে জিজ্ঞাসা করছিলেন।
টম

1

Https://www.w3schools.com/js/js_object_definition.asp এ উল্লিখিত

একটি বস্তু আক্ষরিক ব্যবহার করে, আপনি উভয় সংজ্ঞায়িত এবং তৈরি , এক বস্তুর এক বিবৃতি।

এছাড়াও

অবজেক্ট আক্ষরিক শুধুমাত্র একটি একক বস্তু তৈরি। কখনও কখনও আমরা একটি অবজেক্ট টাইপ করতে চাই যা এক ধরণের বহু অবজেক্ট তৈরি করতে ব্যবহার করা যেতে পারে ।


0

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

উদাসিটি অবজেক্ট-ওরিয়েন্টেড জাভাস্ক্রিপ্ট


0

আসলে, মিথথিংস, আমাদের অবজেক্ট লিটারালগুলিতে ব্যক্তিগত পদ্ধতি থাকতে পারে। নীচে কোড বিবেচনা করুন:

var myObject = {

   publicMethod: function () {
      privateMethod1();
      privateMethod2(); 
      function privateMethod1(){
          console.log('i am privateMethod1');
      } 
      function privateMethod2(){
          console.log('i am privateMethod2');
      } 
   }

}

স্বাদের বিষয়, তবে আমি যেখানে সম্ভব সেখানে অবজেক্ট লিটারাল ব্যবহার করতে পছন্দ করি।


-1

// অবজেক্ট লিটারাল এবং অবজেক্ট কনস্ট্রাক্টর

function MyData(foo, bar) {
        this.foo = foo;
        this.bar = bar;

    }
MyData.prototype.verify = function () {
        return this.foo === this.bar;
    };

//add property using prototype

var MD  = new MyData;//true.
var MD = new MyData();//true.
MD.verify// return only the function structure.
MD.verify(); //return the verify value and in this case return true coz both value is null. 
var MD1  = new MyData(1,2); // intialized the value at the starting. 
MD1.verify// return only the function structure.
MD1.verify(); // return false coz both value are not same.
MD1.verify(3,3);// return false coz this will not check this value intialized at the top 
MyData.prototype.verify = function (foo,bar) {
    return this.foo === this.bar;
};
var MD1  = new MyData(1,2);
MD1.verify();
MD1.verify(3,3);// return false coz this keyword used with foo and bar that will check parent data 

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