জাভাস্ক্রিপ্টে স্ট্রাক্টস


112

পূর্বে, যখন আমাকে বেশ কয়েকটি সম্পর্কিত ভেরিয়েবল সঞ্চয় করার দরকার ছিল, আমি একটি বর্গ তৈরি করতাম।

function Item(id, speaker, country) {
    this.id = id;
    this.speaker = spkr;
    this.country = country;
}
var myItems = [
    new Item(1, 'john', 'au'),
    new Item(2, 'mary', 'us')
];

তবে আমি ভাবছি যে এটি একটি ভাল অনুশীলন কিনা। অন্য কোন হয় ভাল উপায় জাভাস্ক্রিপ্ট মধ্যে একটি struct ভান কিভাবে?

উত্তর:


184

অবজেক্ট লিটারাল এবং নির্মিত নির্মিত বস্তুর মধ্যে একমাত্র পার্থক্য হ'ল প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত বৈশিষ্ট্য।

var o = {
  'a': 3, 'b': 4,
  'doStuff': function() {
    alert(this.a + this.b);
  }
};
o.doStuff(); // displays: 7

আপনি একটি কাঠামো কারখানা করতে পারে।

function makeStruct(names) {
  var names = names.split(' ');
  var count = names.length;
  function constructor() {
    for (var i = 0; i < count; i++) {
      this[names[i]] = arguments[i];
    }
  }
  return constructor;
}

var Item = makeStruct("id speaker country");
var row = new Item(1, 'john', 'au');
alert(row.speaker); // displays: john

27
... এবং তারপরে আমি ফ্যাক্টরির কাজগুলি বুঝতে পেরেছিলাম। কারখানার উদাহরণ সহ একটি স্পষ্ট, বোধগম্য এবং সংক্ষিপ্ত উত্তরের জন্য +1।
জন

আমি এই পদ্ধতির পছন্দ করি তবে আপনি ক্লোজার সংকলক ব্যবহার করেন তবে সাবধান হন। এই ক্ষেত্রে টিউপলটি কেবল স্ট্রিং হিসাবে অ্যাক্সেস করা যায়, কারণ বৈশিষ্ট্যগুলির নাম পরিবর্তন করা হয়। (উন্নত মোডে অন্তত)
Kap

আমি অবজেক্ট আক্ষরিক চেয়ে এই পদ্ধতির দক্ষতা সম্পর্কে কৌতূহল ছিল।
c0degeas

জেএস ক্লাস ব্যবহার করাও সম্ভবত সম্ভব।
SphynxTech

31

আমি সর্বদা অবজেক্ট আক্ষরিক ব্যবহার করি

{id: 1, speaker:"john", country: "au"}

2
এটি কি রক্ষণাবেক্ষণ করা আরও কঠিন করে তোলে না (আপনি কি ভবিষ্যতে নতুন ক্ষেত্র যুক্ত করতে চান), এবং আরও অনেক কোড (প্রতিবার "আইডি", "স্পিকার", "দেশ" টাইপ করবেন)?
নিকফ 6

5
ক্লাসগুলির সাথে সমাধানের মতো এটি ঠিক ঠিক বজায় রাখা যায় কারণ জাভাস্ক্রিপ্ট আপনার যে ক্রিয়াকলাপটি দিয়ে কল করে তার সংখ্যা সম্পর্কে তেমন চিন্তা করে না। আপনি যদি ইমাসের মতো সঠিক সরঞ্জাম ব্যবহার করেন তবে পুনরায় টাইপ করা কোনও সমস্যা নয়। এবং আপনি দেখতে পাচ্ছেন কোনটি সমান যা কোনটি আর্গুমেন্ট অদলবদলের মতো ভুল করে makes
ভাবা

4
তবে সবচেয়ে বড় সমর্থক হ'ল আপনি কম কোড লিখবেন এবং এটি ক্লিনার হয়ে যাবে :)
ভাবা

1
@ ভাভা পুনর্নির্মাণ এখনও একটি সমস্যা, কারণ নতুন ___ (,,)) আরকিটাইপটি অনুলিপি করার চেয়ে আরও বেশি লাফিয়ে উঠেছে। এছাড়াও, কোন পাঠযোগ্যতা নেই। একবার আপনি কোডিংয়ের new READABLE_PART(ignore everything in here)অভ্যাস হয়ে গেলে, {read: "ignore", everything: "ignore", in: "ignore", here: "ignore"} // and then come up with READABLE_PARTআপনার মাথার বিপরীতে খুব স্ক্যানযোগ্য এবং স্ব ডকুমেন্টিং হয়ে যায় । প্রথম পৃষ্ঠাটি দ্রুত প্যাজ করার সময় পঠনযোগ্য। দ্বিতীয়টি, আপনি কেবল বোঝার জন্য স্ট্রাক্টগুলিতে রিফেক্টর।
ক্রিস্টোফার

19

আসল সমস্যাটি হ'ল কোনও ভাষার স্ট্রাকচারগুলি মান ধরণের বলে মনে করা হয় যা উল্লেখের ধরণ নয়। প্রস্তাবিত উত্তরগুলি কাঠামোর জায়গায় অবজেক্টগুলি (যা রেফারেন্স ধরণের) ব্যবহার করার পরামর্শ দেয়। যদিও এটি তার উদ্দেশ্যটি পরিবেশন করতে পারে, তবুও এটি এমন একটি বিষয়টিকে ছাপিয়ে যায় যে কোনও প্রোগ্রামার প্রকৃতপক্ষে রেফারেন্স ধরণের পরিবর্তে মান প্রকারের (আদিম জাতীয়) ব্যবহারের সুবিধাগুলি চান want মান ধরণের, একের জন্য, মেমরি ফাঁস হওয়া উচিত নয়।


8

আমি মনে করি সি-এর মতো স্ট্রাক্টগুলি অনুকরণের জন্য একটি ক্লাস তৈরি করা, যেমন আপনি করছেন, এটি সর্বোত্তম উপায়।

এটি সম্পর্কিত সম্পর্কিত গোষ্ঠীভুক্ত করার এক দুর্দান্ত উপায় এবং ক্রিয়াকলাপগুলিতে পরামিতিগুলি পাস করার বিষয়টি সহজ করে। আমি আরও যুক্তি দিয়েছিলাম যে একটি জাভাস্ক্রিপ্ট শ্রেণি C ++ শ্রেণির চেয়ে C ++ কাঠামোর মতো, বাস্তব বস্তু ভিত্তিক বৈশিষ্ট্যগুলি অনুকরণ করার জন্য প্রয়োজনীয় প্রচেষ্টা বিবেচনা করে ।

আমি খুঁজে পেয়েছি যে জাভাস্ক্রিপ্টকে অন্য ভাষার মতো করার চেষ্টা করা দ্রুত জটিল হয়ে যায়, তবে আমি জাভাস্ক্রিপ্ট ক্লাসকে কার্যবিহীন স্ট্রাক্ট হিসাবে ব্যবহার করে সম্পূর্ণ সমর্থন করি।


আমি স্ট্রাইক, টিপলসের মতো কিছু থাকতে চাই - এমন কিছু যা দৃ data়ভাবে ডেটা সংগ্রহের অনুমতি দেয় - যা সংকলনের সময় ডিল করা হয় এবং অবজেক্টের মতো হ্যাশম্যাপের ওভারহেড রাখে না
derekdreery

4

মার্কসের উত্তর অনুসরণ করে , জেএসের নতুন সংস্করণগুলিতে (ইএস 6 আমি মনে করি) আপনি আরও সহজেই তীর ফাংশন এবং রেস্ট প্যারামিটার ব্যবহার করে একটি 'স্ট্রাক্ট' কারখানা তৈরি করতে পারেন :

const Struct = (...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {}))
const Item = Struct('id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

এটি চলমান ফলাফল:

[ { id: 1, speaker: 'john', country: 'au' },
  { id: 2, speaker: 'mary', country: 'us' } ]
1
john
au

আপনি এটিকে পাইথনের নামের তালিকার মতো দেখতে পারেন:

const NamedStruct = (name, ...keys) => ((...v) => keys.reduce((o, k, i) => {o[k] = v[i]; return o} , {_name: name}))
const Item = NamedStruct('Item', 'id', 'speaker', 'country')
var myItems = [
    Item(1, 'john', 'au'),
    Item(2, 'mary', 'us')
];

console.log(myItems);
console.log(myItems[0].id);
console.log(myItems[0].speaker);
console.log(myItems[0].country);

এবং ফলাফল:

[ { _name: 'Item', id: 1, speaker: 'john', country: 'au' },
  { _name: 'Item', id: 2, speaker: 'mary', country: 'us' } ]
1
john
au

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

3

আমি বোবা স্ট্রাক্টগুলির জন্য জেএসওএন স্টাইল ব্যবহার করি (সদস্যের কোনও কার্য নেই)।


1

যদি আপনি ES6 সামঞ্জস্যের সাথে কাজ করেন তবে আমি স্ট্রাক্ট সংজ্ঞায়নের জন্য একটি ছোট গ্রন্থাগার তৈরি করেছি।

এটি একটি জেকেটি পার্সার যা আপনি এখানে প্রকল্পের সংগ্রহশালা জেকটি পার্সার চেকআউট করতে পারেন

উদাহরণস্বরূপ আপনি আপনার স্ট্রাক্টটি এভাবে তৈরি করতে পারেন

const Person = jkt`
    name: String
    age: Number
`

const someVar = Person({ name: "Aditya", age: "26" })

someVar.name // print "Aditya"
someVar.age // print 26 (integer)

someVar.toJSON() // produce json object with defined schema 

0

এটি সেটআপ করা আরও কাজ, তবে রক্ষণাবেক্ষণ যদি এক সময়ের প্রচেষ্টাটিকে হারাতে পারে তবে এটি আপনার ক্ষেত্রে হতে পারে।

/**
 * @class
 */
class Reference {

    /**
     * @constructs Reference
     * @param {Object} p The properties.
     * @param {String} p.class The class name.
     * @param {String} p.field The field name.
     */
    constructor(p={}) {
        this.class = p.class;
        this.field = p.field;
    }
}

সুবিধাদি:

  • যুক্তির আদেশে আবদ্ধ নয়
  • সহজেই প্রসারণযোগ্য
  • টাইপ স্ক্রিপ্ট সমর্থন:

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

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