বস্তুর আক্ষরিক / আরম্ভকারীগুলিতে স্ব-উল্লেখ


705

জাভাস্ক্রিপ্টে কাজ করার জন্য নীচের মতো কিছু পাওয়ার কোনও উপায় আছে কি?

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

বর্তমান ফর্মটিতে, এই কোডটি অবশ্যই উল্লেখ করা thisহয়নি বলে রেফারেন্স ত্রুটি ছুঁড়েছে foo। কিন্তু হয় সেখানে একটি বস্তু আক্ষরিক সম্পত্তিসমূহ মান আছে কোন ভাবেই অন্যান্য বৈশিষ্ট্য উপর নির্ভর করে তার আগে ঘোষনা পাঠ করলেন?

উত্তর:


741

ঠিক আছে, আমি আপনাকে কেবলমাত্র যা সম্পর্কে বলতে পারি সেগুলি হ'ল :

var foo = {
  a: 5,
  b: 6,
  get c() {
    return this.a + this.b;
  }
}

console.log(foo.c) // 11

এটি ECMAScript 5 ম সংস্করণ স্পেসিফিকেশন দ্বারা প্রবর্তিত একটি সিনট্যাকটিক এক্সটেনশন, সিনট্যাক্সটি বেশিরভাগ আধুনিক ব্রাউজার (আই 9 সহ) সমর্থন করে।


32
খুব সহায়ক উত্তর। 'পান' সম্পর্কিত আরও তথ্য এখানে পাওয়া যাবে: developer.mozilla.org/en-US/docs/
জাভা স্ক্রিপ্ট

5
@FaustoR। হ্যাঁ এটা করে.
চার্লি মার্টিন

48
এই সমাধানের সাথে যদি মানগুলির পরিবর্তন হয় foo.aবা foo.bপরিবর্তিত হয় তবে এর মানটিও সুসংগতিতে পরিবর্তিত foo.cহবে। এটি যা প্রয়োজন তা হতে পারে বা নাও পারে।
এইচবিপি

8
নোট করুন যে thisগভীরতম নেস্টেড বস্তুর সাথে আবদ্ধ। উদাহরণস্বরূপ:... x: { get c () { /*this is x, not foo*/ } } ...
জেড খুল্লা

3
আমার উপরের বক্তব্যটি সম্পূর্ণ করার জন্য, যেহেতু foocfoocthis
মৌমাছি মৌসুমকে

316

আপনি যেমন কিছু করতে পারেন:

var foo = {
   a: 5,
   b: 6,
   init: function() {
       this.c = this.a + this.b;
       return this;
   }
}.init();

এটি অবজেক্টটির এক ধরণের এককালীন সূচনা হবে।

নোট আপনি আসলে ফেরত মান বরাদ্দ যে init()করতে foo, অতএব আপনি করতে হবে return this


95
আপনি এর delete this.initআগেও এটি করতে পারেন return thisযাতে এটি fooকলুষিত হয় না
বিলি মুন

15
@ বিলিমন: হ্যাঁ, যদিও এটি করার পরে অনেকগুলি ইঞ্জিনে পরবর্তী সমস্ত সম্পত্তি অ্যাক্সেসের প্রভাবকে প্রভাবিত করে (উদাহরণস্বরূপ, ভি 8)।
টিজে ক্রাউডার

8
@ মুহাম্মাদ উমার: ইএস 6 ক্লাস কীভাবে প্রশ্নের সাথে প্রাসঙ্গিক তা নিশ্চিত নন।
ফেলিক্স ক্লিং

8
@ মুহম্মদ উমার: ক্লাসগুলি কেবল নির্মাতার কার্যক্রমে সিনট্যাকটিক চিনি, তাই তারা সত্যিকার অর্থে নতুন কিছু সরবরাহ করে না। যেভাবেই হোক, এই প্রশ্নের মূল ফোকাস হ'ল অবজেক্ট ল্যাটারাল।
ফেলিক্স ক্লিং

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

181

সুস্পষ্ট, সহজ উত্তরটি অনুপস্থিত, সুতরাং সম্পূর্ণতার জন্য:

কিন্তু হয় সেখানে একটি বস্তু আক্ষরিক সম্পত্তিসমূহ মান আছে কোন ভাবেই অন্যান্য বৈশিষ্ট্য উপর নির্ভর করে তার আগে ঘোষনা পাঠ করলেন?

না। সমস্ত সমাধানগুলি এটিকে স্থগিত করে না দেওয়া অবধি অবজেক্টটি তৈরি হওয়ার পরে (বিভিন্ন উপায়ে) এবং তারপরে তৃতীয় সম্পত্তি নির্ধারণ করে। সহজ উপায়টি কেবল এটি করা:

var foo = {
    a: 5,
    b: 6
};
foo.c = foo.a + foo.b;

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

আপনার যদি এটির সবার প্রয়োজন হয় তবে এটি অস্থায়ী সম্পত্তি ছাড়াই করতে পারেন:

var foo = function(o) {
    o.c = o.a + o.b;
    return o;
}({a: 5, b: 6});

বা অবশ্যই, যদি আপনার এটি একাধিকবার করার দরকার হয়:

function buildFoo(a, b) {
    var o = {a: a, b: b};
    o.c = o.a + o.b;
    return o;
}

তাহলে আপনার এটি কোথায় ব্যবহার করা উচিত:

var foo = buildFoo(5, 6);

আমার নিজের বিচক্ষণতার জন্য, আমি কিছু ধরণের অফিশিয়াল ডকুমেন্টেশনের সন্ধানের চেষ্টা করছি যা মূলত একই জিনিস বলে - যে কোনও বস্তুর thisকেবলমাত্র বলা অবজেক্টের পদ্ধতিতে উপলব্ধ এবং অন্য কোনও ধরণের বৈশিষ্ট্য নেই। কোন ধারণা যেখানে আমি এটি পেতে পারে? ধন্যবাদ!
ডেভিড কেনেল 5'18

1
@ ডেভিডকেনেল: নির্দিষ্টকরণের চেয়ে বেশি অফিসিয়াল পাবেন না । :-) আপনি সম্ভবত এখানে শুরু করতে এবং এটি অনুসরণ করতে চাই । এটি মোটামুটি অদ্ভুত ভাষা, তবে মূলত আপনি সম্পত্তি সংজ্ঞা মূল্যায়নের বিভিন্ন উপক্লেজগুলিতে দেখতে পাবেন যে সম্পত্তি আরম্ভকারীদের মান নির্ধারণ করার জন্য ক্রিয়াকলাপে অবজেক্টটি উপলব্ধ নেই।
টিজে ক্রাউডার

আমি এখানে ব্রাউজারস্কোপের ফলাফল দেখতে পাচ্ছি না , তবে এটি কি ঠিক তাই নয়? আমার পরিবেশে, ভি delete8 : 10% দ্রুত এবং গেকো: deleteমাত্র 1% ধীর।
TheMaster

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

63

কেবল একটি বেনাম ফাংশন ইনস্ট্যান্ট করুন:

var foo = new function () {
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
};

1
@ বেরগি, কেন? কারণ কেউ এটি থেকে একই জিনিস অন্য ইনস্ট্যান্ট করতে পারেন? এটি এমন নয় যে তারা কেবল কোনও বস্তুর আক্ষরিক ক্লোন করতে পারে না। new Point(x, y)ফাংশনটির পুনঃব্যবহারের জন্য নামকরণ করা ছাড়া এটি যুক্তি পাস করার চেয়ে আলাদা নয়।
zzzzBov

1
@zzzzBov: অবশ্যই তারা কেবলমাত্র বিষয়টিকে ক্লোন করতে পারে, তবে একটি আইইএফই সমাধানের সাথে তুলনায় (টিজেক্রোডার এর জবাবের মতো) আপনার সমাধানটি কনস্ট্রাক্টর ফাংশন ফাঁস করে এবং একটি অতিরিক্ত অতিরিক্ত প্রোটোটাইপ অবজেক্ট তৈরি করে।
বার্গি

5
@zzzzBov: কেবল ব্যবহার করুন var foo = function() { this.…; return this; }.call({});যা সিন্টেক্সিকভাবে খুব আলাদা নয় তবে শব্দার্থগতভাবে বুদ্ধিমান।
বার্গি

1
@ বেরগি, আপনি যদি এটি গুরুত্বপূর্ণ মনে করেন তবে কেন নিজের উত্তরটি মিশ্রণে যুক্ত করবেন না?
zzzzBov

3
আপনি এটি পেয়েছেন। আমি আসলে newকীওয়ার্ডটি লক্ষ্য করিনি ।
র্যান্ডি

26

এখন ES6 এ আপনি অলস ক্যাশেড বৈশিষ্ট্য তৈরি করতে পারেন। প্রথমে ব্যবহারের পরে সম্পত্তিটি স্থিতিশীল সম্পত্তি হিসাবে একবার স্থির করে ates ফলাফল: দ্বিতীয় বার গণিত ফাংশন ওভারহেড এড়ানো হয়।

যাদুটি গ্রাহকের মধ্যে রয়েছে।

const foo = {
    a: 5,
    b: 6,
    get c() {
        delete this.c;
        return this.c = this.a + this.b
    }
};

তীরটিতে গিটারটি চারপাশের লেক্সিকাল স্কোপটিকে thisবাছাই করে ।

foo     // {a: 5, b: 6}
foo.c   // 11
foo     // {a: 5, b: 6 , c: 11}  

1
এস 5 এর এমন বৈশিষ্ট্যও রয়েছে যা আপনি কেবল Object.defineProperty(foo, 'c', {get:function() {...}})তাদের সংজ্ঞায়িত করতে ব্যবহার করতে পারেন । এটি সহজে কোনও কারখানায় একটি অনর্থক পদ্ধতিতে যেমন এটির মতো করা যায়। অবশ্যই আপনি যদি getচিনিটি ব্যবহার করতে পারেন তবে এটি বেশি পঠনযোগ্য তবে ক্ষমতা সেখানে রয়েছে।
আলুয়ান হাদাদাদ

21

কিছু বন্ধের সাথে এটি মোকাবেলা করা উচিত;

var foo = function() {
    var a = 5;
    var b = 6;
    var c = a + b;

    return {
        a: a,
        b: b,
        c: c
    }
}();

এর মধ্যে ঘোষিত সমস্ত ভেরিয়েবলগুলি fooব্যক্তিগত foo, যেমন আপনি যে কোনও ফাংশন ঘোষণার সাথে প্রত্যাশা করতেন এবং সেগুলি সমস্ত সুযোগে থাকায় , কোনও ফাংশন দিয়ে thisআপনি যেমন আশা করবেন ঠিক তেমনভাবে রেফার করার প্রয়োজন ছাড়াই এগুলি একে অপরের অ্যাক্সেস রয়েছে । পার্থক্যটি হ'ল এই ফাংশনটি এমন কোনও বস্তু ফেরত দেয় যা প্রাইভেট ভেরিয়েবলগুলি প্রকাশ করে এবং সেই অবজেক্টটিকে নির্ধারিত করে foo। শেষ অবধি, আপনি কেবলমাত্র সেই ইন্টারফেসটি ফিরে আসবেন যা আপনি return {}বিবৃতি দিয়ে কোনও অবজেক্ট হিসাবে প্রকাশ করতে চান ।

ফাংশনটি তারপরে শেষে সম্পাদিত হয় ()যার ফলে পুরো foo অবজেক্টটি মূল্যায়ন করা যায়, তাত্ক্ষণিকের মধ্যে সমস্ত ভেরিয়েবল এবং রিটার্ন অবজেক্টের বৈশিষ্ট্য হিসাবে যুক্ত হয় foo()


14
এটিকে একটি "ক্লোজার" বলা বিভ্রান্তিকর এবং বিভ্রান্তিকর। যদিও কোনও ফাংশন থেকে ওজবেক্টের মান ফিরিয়ে দেওয়ার যথাযথ অর্থের সাথে মতামতগুলি পৃথক হয় তবে কারও বইয়ে এটি বন্ধ হওয়ার বিষয়টি বোঝায় না।

16

আপনি এটি এইভাবে করতে পারে

var a, b
var foo = {
    a: a = 5,
    b: b = 6,
    c: a + b
}

এই পদ্ধতিটি আমার পক্ষে কার্যকর প্রমাণিত হয়েছে যখন আমাকে কোনও ফাংশনটি মূলত ঘোষিত অবজেক্টটির উল্লেখ করতে হয়েছিল। নীচে আমি এটি কীভাবে ব্যবহার করেছি তার একটি ন্যূনতম উদাহরণ:

function createMyObject() {
    var count = 0, self
    return {
        a: self = {
            log: function() {
                console.log(count++)
                return self
            }
        }
    }
}

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

আপনি যদি পরিবর্তে thisনীচে চিত্রিত হিসাবে ব্যবহার করেন

function createMyObject() {
    var count = 0
    return {
        a: {
            log: function() {
                console.log(count++)
                return this
            }
        }
    }
}

তারপরে নীচের কোডটি 0, 1, 2 লগ করবে এবং তারপরে একটি ত্রুটি দেবে

var o = createMyObject()
var log = o.a.log
o.a.log().log() // this refers to the o.a object so the chaining works
log().log() // this refers to the window object so the chaining fails!

স্ব-পদ্ধতি ব্যবহার করে আপনি গ্যারান্টি দেন যে মুদ্রণটি ফাংশনটি যে প্রসঙ্গে চালিত হয়েছে তা নির্বিশেষে সর্বদা একই জিনিসটি ফিরে আসবে। উপরের কোডটি ঠিক সূক্ষ্মভাবে চলবে এবং এর স্ব সংস্করণ ব্যবহার করার সময় 0, 1, 2 এবং 3 লগ করবে createMyObject()


3
আপনি সমস্ত সেমিকোলন বাদ দিয়ে ভাল উদাহরণগুলি।


9

সমাপ্তির জন্য, ES6 এ আমরা ক্লাস পেয়েছি (এটি সর্বশেষতম ব্রাউজারগুলির দ্বারা লেখার সময় সমর্থিত, তবে ব্যাবেল, টাইপস্ক্রিপ্ট এবং অন্যান্য ট্রান্সপোর্টারগুলিতে উপলব্ধ)

class Foo {
  constructor(){
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
  }  
}

const foo = new Foo();

7

আপনি এটি মডিউল প্যাটার্ন ব্যবহার করে করতে পারেন। যেমন:

var foo = function() {
  var that = {};

  that.a = 7;
  that.b = 6;

  that.c = function() {
    return that.a + that.b;
  }

  return that;
};
var fooObject = foo();
fooObject.c(); //13

এই ধরণটির সাহায্যে আপনি আপনার প্রয়োজন অনুসারে কয়েকটি foo অবজেক্ট ইনস্ট্যান্ট করতে পারেন।

http://jsfiddle.net/jPNxY/1/


2
এটি মডিউল প্যাটার্নের উদাহরণ নয়, কেবল একটি ফাংশন। যদি foo সংজ্ঞাটির শেষ লাইনটি হয় তবে }();এটি স্বয়ংক্রিয়ভাবে কার্যকর হবে এবং কোনও বস্তুটি ফিরিয়ে দেবে, কোনও ফাংশন নয়। এছাড়াও, foo.cএকটি ফাংশন, সুতরাং এটির জন্য ক্লোবারগুলি লিখে ফাংশন এবং এর মাধ্যমে পরবর্তী অনুরোধ fooObject.c()ব্যর্থ হবে। সম্ভবত এই ঝাঁকুনি আপনি যা যাচ্ছেন তার কাছাকাছি রয়েছে (এটি একটি সিঙ্গলটনও, ইনস্ট্যান্টেট করার জন্য ডিজাইন করা হয়নি)।
হলিস্টার

2
"মডিউল প্যাটার্নটি মূলত প্রচলিত সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের ক্লাসগুলির জন্য ব্যক্তিগত এবং পাবলিক উভয় এনক্যাপুলেশন সরবরাহ করার একটি উপায় হিসাবে সংজ্ঞায়িত করা হয়েছিল"। থেকে: জাভাস্ক্রিপ্ট ডিজাইনের প্যাটার্নগুলি শেখা । এটি অবজেক্টটি উপরে বর্ণিত মডিউল প্যাটার্নটি অনুসরণ করে তবে সম্ভবত এটি ব্যাখ্যা করা সেরা নয় কারণ সরকারী এবং ব্যক্তিগত সম্পত্তি / পদ্ধতিগুলি দেখানো হচ্ছে না। এই এক jsfiddle.net/9nnR5/2 সরকারী এবং ব্যক্তিগত সম্পত্তি / পদ্ধতিগুলির সাথে একই জিনিস। তাই দুজনেই এই প্যাটার্নটি অনুসরণ করছেন
রাফায়েল রোচা

6

এটি সম্পাদন করার বিভিন্ন উপায় রয়েছে; এটি আমি ব্যবহার করব:

function Obj() {
 this.a = 5;
 this.b = this.a + 1;
 // return this; // commented out because this happens automatically
}

var o = new Obj();
o.b; // === 6

2
এটি কাজ করে তবে বস্তুর আক্ষরিক স্বরলিপিগুলির সুবিধাগুলি সরিয়ে দেয়।
কেপোজিন

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

6

কেবল চিন্তার স্বার্থে - সময়রেখার বাইরে অবজেক্টের বৈশিষ্ট্যগুলি রাখুন:

var foo = {
    a: function(){return 5}(),
    b: function(){return 6}(),
    c: function(){return this.a + this.b}
}

console.log(foo.c())

উপরে আরও ভাল উত্তর আছে । আপনি যে প্রশ্নটি দিয়েছিলেন আমি উদাহরণ কোডটি এভাবেই সংশোধন করেছি।

হালনাগাদ:

var foo = {
    get a(){return 5},
    get b(){return 6},
    get c(){return this.a + this.b}
}
// console.log(foo.c);

2
ES6 এ আপনি এই সাধারণ পদ্ধতিটি আরও মার্জিত var foo = { get a(){return 5}, get b(){return 6}, get c(){return this.a + this.b} }করতে পারেন : সুতরাং এখন আপনি কেবল :) এর foo.cপরিবর্তে এটি করতে পারেন foo.c():) (উত্তর দেওয়ার জন্য নির্দ্বিধায় তাই বিন্যাসটি আরও ভাল!)

5

আক্ষরিকভাবে আপনার অবজেক্টে নতুন ফাংশন তৈরি করা এবং কোনও কনস্ট্রাক্টরকে আহ্বান করা মূল সমস্যা থেকে মূলত প্রস্থান বলে মনে হয় এবং এটি অপ্রয়োজনীয়।

আক্ষরিক শুরুর সময় আপনি কোনও ভাইবোন সম্পত্তিকে উল্লেখ করতে পারবেন না।

var x = { a: 1, b: 2, c: a + b } // not defined 
var y = { a: 1, b: 2, c: y.a + y.b } // not defined 

গণিত বৈশিষ্ট্যগুলির সহজ সমাধান অনুসরণ করে (কোনও গাদা নয়, কোনও কার্যকারিতা নেই, কোনও নির্মাণকারী নেই):

var x = { a: 1, b: 2 };

x.c = x.a + x.b; // apply computed property

3

এখানে পোস্ট করা অন্যান্য উত্তরগুলি আরও ভাল তবে এখানে একটি বিকল্প রয়েছে যা:

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

বেনামে ফাংশন এবং উইন্ডো স্টোরেজ স্ব-সম্পাদন করা

var foo = {
    bar:(function(){
        window.temp = "qwert";
        return window.temp;
    })(),
    baz: window.temp
};

অর্ডার গ্যারান্টিযুক্ত ( barআগেbaz )।

এটি windowঅবশ্যই দূষিত হয়, তবে আমি কেউ কল্পনা করতে পারি না এমন কোনও স্ক্রিপ্ট লিখছে যা window.tempস্থির থাকা দরকার to হতে পারেtempMyApp আপনি ভীতু করছি।

এটি কুরুচিপূর্ণ তবে মাঝে মাঝে দরকারী। উদাহরণটি যখন আপনি কঠোর প্রারম্ভিক অবস্থার সাথে একটি এপিআই ব্যবহার করছেন এবং রিপ্যাক্টরিংয়ের মতো মনে করেন না তাই স্কোপিংটি সঠিক।

এবং এটি অবশ্যই শুকনো।


3

এগুলির মূল কী এসসিপিইপি

আপনি যে সম্পত্তিটিকে নিজের ইন্সট্যান্টেড অবজেক্ট হিসাবে সংজ্ঞায়িত করতে চান তার "প্যারেন্ট" (প্যারেন্ট অবজেক্ট) আপনাকে এনক্যাপুলেট করতে হবে এবং তারপরে আপনি মূল শব্দটি ব্যবহার করে ভাইবালির বৈশিষ্ট্যের জন্য রেফারেন্স করতে পারেন this

এটি অত্যন্ত, খুব মনে রাখা খুব গুরুত্বপূর্ণ যে আপনি যদি thisপ্রথমে এটি না করে thisউল্লেখ করেন তবে বাইরের সুযোগটি উল্লেখ করা হবে ... যা windowবস্তু হবে।

var x = 9   //this is really window.x
var bar = {
  x: 1,
  y: 2,
  foo: new function(){
    this.a = 5, //assign value
    this.b = 6,
    this.c = this.a + this.b;  // 11
  },
  z: this.x   // 9 (not 1 as you might expect, b/c *this* refers `window` object)
};

2
এটি বৈধ জেএসও নয়।

2

যদি আপনার অবজেক্টটি কোনও ফাংশন হিসাবে লিখিত হয় যা কোনও বস্তুকে রিটার্ন দেয় এবং আপনি ES6 অবজেক্ট-অ্যাট্রিবিউট 'পদ্ধতিগুলি' ব্যবহার করেন, তবে এটি সম্ভব:

const module = (state) => ({
  a: 1,
  oneThing() {
    state.b = state.b + this.a
  },
  anotherThing() {
    this.oneThing();
    state.c = state.b + this.a
  },
});

const store = {b: 10};
const root = module(store);

root.oneThing();
console.log(store);

root.anotherThing();
console.log(store);

console.log(root, Object.keys(root), root.prototype);

2

আমি বিকল্প হিসাবে নিম্নলিখিত কোড ব্যবহার করি এবং এটি কার্যকর হয়। এবং ভেরিয়েবল অ্যারে হতে পারে। (@ ফ্যাস্টো আর।)

var foo = {
  a: 5,
  b: 6,
  c: function() {
    return this.a + this.b;
  },

  d: [10,20,30],
  e: function(x) {
    this.d.push(x);
    return this.d;
  }
};
foo.c(); // 11
foo.e(40); // foo.d = [10,20,30,40]

2

এখানে একটি ঝরঝরে ES6 উপায়:

var foo = (o => ({
    ...o,
    c: o.a + o.b
  }))({
    a: 5,
    b: 6
  });
  
console.log(foo);

আমি এটির মতো কিছু করতে এটি ব্যবহার করি:

const constants = Object.freeze(
  (_ => ({
    ..._,
    flag_data: {
      [_.a_flag]: 'foo',
      [_.b_flag]: 'bar',
      [_.c_flag]: 'oof'
    }
  }))({
    a_flag: 5,
    b_flag: 6,
    c_flag: 7,
  })
);

console.log(constants.flag_data[constants.b_flag]);


1

এই সমাধান সম্পর্কে কীভাবে এটি অ্যারে সহ নেস্টেড বস্তুগুলির সাথে কাজ করবে

      Object.prototype.assignOwnProVal
     = function (to,from){ 
            function compose(obj,string){ 
                var parts = string.split('.'); 
                var newObj = obj[parts[0]]; 
                if(parts[1]){ 
                    parts.splice(0,1);
                    var newString = parts.join('.'); 
                    return compose(newObj,newString); 
                } 
                return newObj; 
            } 
            this[to] = compose(this,from);
     } 
     var obj = { name : 'Gaurav', temp : 
                  {id : [10,20], city:
                        {street:'Brunswick'}} } 
     obj.assignOwnProVal('street','temp.city.street'); 
     obj.assignOwnProVal('myid','temp.id.1');

0

কোনও বিকল্পের মধ্যে ছুঁড়ে ফেলা হচ্ছে যেহেতু আমি এই সঠিক দৃশ্যটি coveredেকে দেখিনি। আপনি কখন আপডেট বা আপডেট করতে চান না , তবে কোনও ES6 IIFE ভাল কাজ করে।cab

var foo = ((a,b) => ({
    a,
    b,
    c: a + b
}))(a,b);

আমার প্রয়োজনের জন্য, আমার কাছে একটি বস্তু রয়েছে যা একটি অ্যারের সাথে সম্পর্কিত যা শেষ হয়ে যাবে একটি লুপে ব্যবহৃত হবে, তাই আমি কেবল একবার কিছু সাধারণ সেটআপ গণনা করতে চাই, তাই এটি আমার কাছে রয়েছে:

  let processingState = ((indexOfSelectedTier) => ({
      selectedTier,
      indexOfSelectedTier,
      hasUpperTierSelection: tiers.slice(0,indexOfSelectedTier)
                             .some(t => pendingSelectedFiltersState[t.name]),
  }))(tiers.indexOf(selectedTier));

যেহেতু আমার জন্য একটি সম্পত্তি সেট করা দরকার এবং সম্পত্তি নির্ধারণের সময় indexOfSelectedTierআমার সেই মানটি ব্যবহার করা দরকার hasUpperTierSelection, তাই আমি প্রথমে সেই মানটি গণনা করি এবং আইআইএফই-তে পরম হিসাবে এটি পাস করি


0

অন্যান্য পদ্ধতির উদ্দেশ্য হ'ল সম্পত্তিটিকে অর্পণ করার আগে তাকে প্রথমে ডিক্লেয়ার করতে হবে:

const foo = {};
foo.a = 5;
foo.b = 6;
foo.c = foo.a + foo.b;  // Does work
foo.getSum = () => foo.a + foo.b + foo.c;  // foo.getSum() === 22

এটির সাহায্যে আপনি ইতিমধ্যে নির্ধারিত মানগুলি অ্যাক্সেস করতে অবজেক্ট ভেরিয়েবলের নামটি ব্যবহার করতে পারেন। ফাইলের
জন্য সেরা config.js


এটি কোনও স্ব-রেফারেন্স নয়, বরং ঘোষিত ভেরিয়েবলের একটি রেফারেন্স fooযা প্রশ্নে বস্তুটিকে নির্দেশ করে।
ডেরেক হেন্ডারসন

0
var x = {
    a: (window.secreta = 5),
    b: (window.secretb = 6),
    c: window.secreta + window.secretb
};

এটি @ স্লাইসডডয়েডের উত্তরের প্রায় সমান, তবে কোনও ফাংশন ব্যবহার করে না।


-1

দ্রষ্টব্য: এই সমাধানটি টাইপস্ক্রিপ্ট ব্যবহার করে (আপনি যদি ভ্যানিলা জেএস ব্যবহার করতে পারেন যা প্রয়োজনে টিএস সংকলন করে)

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

    // this method is just to check/test this solution 
    check(){
        console.log(this.def.qwe);
    }
}

// these two lines are just to check
let instance = new asd();
instance.check();

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

এই দ্রবণটি ব্যবহার করার সময় মুখ্য বিষয়টি হ'ল আপনার কাছে ঠিক একই ইন্টারফেস রয়েছে যা আপনি কোনও অবজেক্টের কাছ থেকে পেয়েছিলেন। এবং সিনট্যাক্সটি কোনও বস্তুর আক্ষরিক (বনাম কোনও ফাংশন ব্যবহার করে ইত্যাদি) খুব কাছে।

নিম্নলিখিত তুলনা করুন

সমাধান আমি প্রস্তাব করেছি

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

সমাধান যদি অবজেক্ট লিটারেলগুলি যথেষ্ট হয়

var asd = {
    def : {
        ads:'asd',
        qwe: this.ads + '123';, //ILLEGAL CODE; just to show ideal scenario
    }
}

আরেকটি উদাহরণ

এখানে এই শ্রেণিতে, আপনি তাদের মধ্যে একাধিক আপেক্ষিক পাথ একত্রিত করতে পারেন যা কোনও বস্তুর আক্ষরিক সাথে সম্ভব নয়।

class CONSTANT {
    static readonly PATH = new class {
        /** private visibility because these relative paths don't make sense for direct access, they're only useful to path class
         *
         */
        private readonly RELATIVE = new class {
            readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: fs.PathLike = '\\assets\\aep-template\\src\\video-template.aep';
            readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION: fs.PathLike = '\\assets\\aep-template\\intermediates\\video-template.aepx';
            readonly RELATIVE_PATH_TO_AFTER_EFFECTS: fs.PathLike = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe';
            readonly OUTPUT_DIRECTORY_NAME: fs.PathLike = '\\output';
            readonly INPUT_DIRECTORY_NAME: fs.PathLike = '\\input';
            readonly ASSETS_DIRECTORY_NAME: fs.PathLike = '\\assets';
        };
    }
}

2
আপনার উত্তরটি সম্পূর্ণ অপ্রাসঙ্গিক বলেই এটি হতে পারে? আমি সম্মতি
জানাই যে ডাউনটা ভোটারদের

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

-2

আপনি যদি দেশীয় জেএস ব্যবহার করতে চান তবে অন্যান্য উত্তরগুলি ভাল সমাধান সরবরাহ করে।

তবে আপনি যদি স্ব-উল্লেখযোগ্য বিষয়গুলি লিখতে রাজি হন তবে:

{ 
  a: ...,
  b: "${this.a + this.a}",
}

আমি স্ব-রেফারেন্সড-অবজেক্ট নামে একটি এনপিএম লাইব্রেরি লিখেছি যা সেই সিনট্যাক্সকে সমর্থন করে এবং একটি নেটিভ অবজেক্ট ফিরিয়ে দেয়।


1
শুধুমাত্র উত্তর লিঙ্ক এড়ানো দয়া করে । উত্তর যে "সবে আরো একটি বহিস্থিত সাইটের একটি লিঙ্ক চেয়ে" হয় মুছে ফেলা হতে পারে
কোয়েন্টিন

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

এখানে উন্নতি করতে বেশ কয়েকটি জিনিস। প্রথম এবং স্পষ্টতই, আপনি ব্যাক টিক্স ছাড়াই টেম্পলেট আক্ষরিক সিনট্যাক্স ব্যবহার করছেন। তোমার bসম্পত্তি মান হওয়া উচিত: ${this.a + this.a}। দ্বিতীয়ত, তবে এর চেয়েও কম গুরুত্বপূর্ণ, আপনি এমন কিছু ব্যবহার করে স্ট্রিং নয়, একটি নম্বর ফিরিয়ে দিতে চান parseInt। সর্বশেষ এবং সর্বাধিক গুরুত্বপূর্ণ, যখন আমি এই উদাহরণটি চেষ্টা করলাম এটি কেবল কার্যকর হয় না, একই কারণে ওপি জিজ্ঞাসা করছে। thisআয় যখন তার নিজের বস্তুর ঘোষণা ব্যবহৃত undefined। @ অ্যালেক্স-ই-লিওন
অ্যালেক ডোনাল্ড মাথার

@ অ্যালেকডোনাল্ডমথার - একবার দেখে কিছুটা প্রতিক্রিয়া জানানোর জন্য সময় দেওয়ার জন্য ধন্যবাদ! আপনি যদি প্রকল্পটিতে আগ্রহী হন তবে এই আলোচনাটি গিথুব এ সরিয়ে নেওয়া ভাল তবে আপনার প্রতিক্রিয়ার কয়েকটি উত্তর দেওয়া: - ব্যাকটিক্স ব্যবহার করা: পূর্ববর্তী মন্তব্যে উল্লিখিত হিসাবে, এই বাক্য গঠনটি জেএস দ্বারা সমর্থিত নয়, এবং এর পরিবর্তে স্ট্রিংগুলি ব্যবহার করে জজগুলি "এটি" সমাধান করার চেষ্টা করতে না পারার আগে ব্যাকটিকগুলি এখানে আবশ্যক - সংখ্যার ফিরিয়ে দেওয়ার জন্য, যদি একটি + বি ইতিমধ্যে সংখ্যার হয় তবে এটি কাজ করা উচিত, যেহেতু a + b উভয়ই এবং যদি উভয় হয় তবে একটি সংখ্যা ফিরে আসবে ইতিমধ্যে সংখ্যা
অ্যালেক্স-ই-লিওন

এই প্রত্যাবর্তন অপরিবর্তিত পুনরায়, আপনি কীভাবে গ্রন্থাগারটি ব্যবহার করার চেষ্টা করেছিলেন তা ব্যাখ্যা করতে পারেন? এটি হওয়া উচিত নয়, তবে সম্ভবত আমি একটি কিনারা রেখে এসেছি? এটি বলেছিল, এই গ্রন্থাগারটি বিষয়টি পুরোপুরি সমাধান করে না, এবং এর নিজস্ব ট্রেড অফ রয়েছে, তবে আপনি যদি আমাকে এটির উন্নতি / ব্যবহার করতে সহায়তা করতে আগ্রহী হন তবে আমাকে জানান!
অ্যালেক্স-ই-লিওন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.