জাভাস্ক্রিপ্ট: মান দ্বারা অবজেক্ট কীভাবে পাস করবেন?


96
  • পরামিতি হিসাবে বস্তুগুলি পাস করার সময়, জাভাস্ক্রিপ্ট তাদের রেফারেন্স দ্বারা পাস করে এবং অবজেক্টগুলির স্থানীয় অনুলিপি তৈরি করা শক্ত করে তোলে।

    var o = {};
    (function(x){
        var obj = x;
        obj.foo = 'foo';
        obj.bar = 'bar';
    })(o)
    

    oহবে .fooএবং .bar

  • ক্লোনিংয়ের মাধ্যমে এটি প্রায় পাওয়া সম্ভব; সাধারণ উদাহরণ:

    var o = {};
    
    function Clone(x) {
       for(p in x)
       this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p];
    }
    
    (function(x){
        var obj = new Clone(x);
        obj.foo = 'foo';
        obj.bar = 'bar';
    })(o)
    

    o.fooবা হবে না .bar


প্রশ্ন

  1. স্থানীয় অনুলিপি / ক্লোন তৈরির পরিবর্তে মান দ্বারা অবজেক্টগুলি পাস করার কি আরও ভাল উপায় আছে?

4
এটির প্রয়োজনে আপনার ব্যবহারের ক্ষেত্রে কী?
jondavidjohn

4
প্রোগ্রামিং মজা। নতুন জেএস ইঞ্জিনগুলি এটিকে সম্বোধন করেছে কিনা তা (প্রযুক্তিগতভাবে, এটি মান অনুসারে রেফারেন্সটি পার করছে), তবে মূলত মজাদার জন্য।
ভোলআরন

4
দেখুন জাভাস্ক্রিপ্ট কি কোনও পাস-বাই-রেফারেন্স বা পাস-বাই-ভ্যালু ভাষা? - জাভাস্ক্রিপ্ট রেফারেন্স দ্বারা পাস করে না। জাভা এর মতো, কোনও ফাংশনে অবজেক্টগুলি পাস করার সময় এটি মান দিয়ে যায় তবে মানটি একটি রেফারেন্স। আরও দেখুন জাভা কি রেফারেন্স দিয়ে পাস হয়?
রিচার্ড জে পি লে গুয়েন

4
যতদূর আমি সচেতন আপনি মান দ্বারা বস্তুগুলি পাস করতে পারবেন না। সেখানে থাকলেও এটি কার্যকরভাবে আপনি যে ক্লোনিংটি উপরে উল্লেখ করছেন তা করছে doing সুতরাং আমি দেখতে পাবার মতো কিছুই নেই। সম্ভবত 3 লাইনের কোড সংরক্ষণ করা ব্যতীত।
Thor84no

4
@ ভোলআরন হ্যাঁ, তারা ভাষা ডিজাইনের বৈশিষ্ট্যটি সঠিকভাবে প্রয়োগ করে এটিকে সম্বোধন করেছেন।
jondavidjohn

উত্তর:


61

আসলে তা না.

আপনার আসলে যা প্রয়োজন তার উপর নির্ভর করে একটি সম্ভাবনাo কোনও নতুন অবজেক্টের প্রোটোটাইপ হিসাবে সেট করা হতে পারে ।

var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

সুতরাং আপনি যে কোনও সম্পত্তি যুক্ত objকরবেন তাতে যুক্ত হবে না o। কোনও objসম্পত্তি হিসাবে একই সম্পত্তি নামের সাথে যুক্ত কোনও সম্পত্তি সম্পত্তির oছায়া দেবে o

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

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

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // 'new_value'

এখানে আপনি দেখতে পারেন কারণ আপনি এ অ্যারে ছায়া করা হয়নি bazউপর oএকটি সঙ্গে bazউপর সম্পত্তি obj, o.bazএরে পরিবর্তিত হয়।

সুতরাং পরিবর্তে, আপনাকে প্রথমে এটি ছায়া নেওয়ার দরকার ছিল:

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz = [];
    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // undefined

4
+1, আমি Object.createআমার জবাবটিতেও পরামর্শ দিতে যাচ্ছিলাম, তবে আমি অনুলিপিটি অনুলিপি করতে প্রসারিত করতে চাইনি ;-)
অ্যান্ডি ই

+1, আমি এই সম্পর্কে ভুলে গেছি। আমি চেষ্টা করেছিলাম var obj = new Object(x)। আমার কাছে, আমি মনে করব যে new Object(x)এটি Object.create(x)ডিফল্টরূপে সঞ্চালিত হবে - আকর্ষণীয়
ভলিউরন

4
@ ভোলআরন: হ্যাঁ, new Object(x)কেবল একই জিনিসটি পিছনে ফেলেছে (আপনি সম্ভবত লক্ষ্য করেছেন) । ক্লোন করার কোনও নেটিভ উপায় থাকলে এটি চমৎকার হবে। কাজ কিছু আছে কিনা তা নিশ্চিত নন।
ব্যবহারকারী 113716

45

এই উত্তরটি https://stackoverflow.com/a/5344074/746491 দেখুন

সংক্ষেপে, JSON.parse(JSON.stringify(obj))আপনার জিনিসগুলি অনুলিপি করার একটি দ্রুত উপায়, যদি আপনার বস্তুগুলি জসন-এ সিরিয়াল করা যায়।


4
আমি এগুলি এড়াতে থাকি কারণ আইটেমগুলি সর্বদা সিরিয়াল করা যায় না এবং কারণ JSONআই 7/8 এর মতো মধ্য বয়সী ব্রাউজারগুলিতে অন্তর্ভুক্ত নেই এবং এটি সংজ্ঞায়িত করা দরকার - এর মতো নামের সাথে আরও বর্ণনামূলক হতে পারে Clone। যাইহোক, আমি সন্দেহ করি ভবিষ্যতে আমার মতামত পরিবর্তিত হতে পারে, যেহেতু জেএসওএন ব্রাউজার ভিত্তিক নন সফ্টওয়্যার যেমন ডেটাবেস এবং আইডিইগুলিতে আরও ভারীভাবে সংহত হয়েছে
ভলআরন

4
যদি কোনও ফাংশন এবং তারিখের অবজেক্ট না থাকে, JSON.parse সমাধানটি সেরা বলে মনে হচ্ছে। stackoverflow.com/questions/122102/...
Herr_Hansen

সত্যি?!? কেবল কোনও অবজেক্ট কপি তৈরি করতে JSON এ সিরিয়াল করবেন? তবুও এই অযৌক্তিক ভাষা ঘৃণার আর একটি কারণ।
রায়াননার্ড

4
জেসনকে সিরিয়াল করা সত্যিই এটির অনুলিপি করার একটি দ্রুত উপায়? নোডজেএস ডকুমেন্টেশন অনুসারে জেএসওএন হেরফের সর্বাধিক সিপিইউ নিবিড় কাজ। nodejs.org/en/docs/guides/dont- block
the-

40

এখানে ক্লোন ফাংশন যা বস্তুর গভীর অনুলিপি সম্পাদন করবে:

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = new obj.constructor(); 
    for(var key in obj)
        temp[key] = clone(obj[key]);

    return temp;
}

এখন আপনি এটি ব্যবহার করতে পারেন:

(function(x){
    var obj = clone(x);
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o)

4
এটি একটি গভীর উত্তর ছিল।
নাথান

সুন্দর! সেরা উত্তর আইএমও।
13:30 এ গ্যান্ডার্স

24

ব্যবহার Object.assign()

উদাহরণ:

var a = {some: object};
var b = new Object;
Object.assign(b, a);
// b now equals a, but not by association.

একটি পরিষ্কার উদাহরণ যা একই কাজ করে:

var a = {some: object};
var b = Object.assign({}, a);
// Once again, b now equals a.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / অবজেক্ট / পাসপোর্ট


4
আরও ভাল:var b = Object.assign({}, a);
বার্গি

রাজি। সেই অনুযায়ী উত্তর আপডেট করা হচ্ছে। এছাড়াও, প্রতিটি ব্রাউজার অ্যাসাইন () পদ্ধতি সমর্থন করে না। আপনার সামঞ্জস্যতার প্রয়োজনীয়তার উপর নির্ভর করে এমডিএন-র মতো পলিফিল ব্যবহারের প্রয়োজন হতে পারে।
ব্র্যান্ডন

4
@ ব্র্যান্ডন, আপনি যে লিঙ্কটি দিয়েছেন সেই একই লিঙ্কে এটি গভীর ক্লোনিংয়ের জন্য একটি সতর্কতা দেয়: "গভীর ক্লোনিংয়ের জন্য আমাদের অন্যান্য বিকল্পগুলি ব্যবহার করা প্রয়োজন কারণ অবজেক্ট.সেসাইন () সম্পত্তি মানগুলি অনুলিপি করে। যদি উত্স মানটি কোনও অবজেক্টের রেফারেন্স হয়, এটি কেবলমাত্র সেই উল্লেখের প্রতিলিপি করে ies "
pwilcox

4
এটি কাজ করে তবে মনে রাখবেন যে এটি গভীর অনুলিপি সম্পাদন করে না ভিতরে থাকা কোনও বস্তুর aরেফারেন্স হিসাবে অনুলিপি করা হবে।
স্টেইনভ

16

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

এমনকি আপনি যা জিজ্ঞাসা করছেন তা কোনও প্রকারের সহজ, মাতৃভাষা নির্মাণের জন্য সরবরাহ করা থাকলেও এটি প্রযুক্তিগতভাবে ক্লোনিং হয়ে থাকবে।

জাভাস্ক্রিপ্ট সত্যিই কেবল পাস-বাই-ভ্যালু ... এটি ঠিক যে পাস করা মানটি কোনও কিছুর একটি উল্লেখ হতে পারে।


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

13
জেএসে লোকেরা যখন মানটির পরিবর্তে রেফারেন্স দিয়ে বলে তখন তাদের অর্থ মানটি সদৃশের পরিবর্তে পয়েন্টারের মতো। এটি বেশ প্রতিষ্ঠিত লিঙ্গো।
এরিক পুনরায়

4
@ এরিক: আমার বিনীত মতে, আমি মনে করি এটি আরও স্পষ্টভাবে সংজ্ঞায়িত করা ভাল যাতে নতুনদের ভাষায় বিভ্রান্ত না করা। যেহেতু কোনও কিছু সুপ্রতিষ্ঠিত হয়েছে তার অর্থ এটি উপযুক্ত বা এমনকি প্রযুক্তিগতভাবে সঠিক নয় (কারণ এটি নয়)। লোকেরা "রেফারেন্স দ্বারা" বলে কারণ এটি সত্যভাবে কীভাবে কাজ করে তা ব্যাখ্যা করার চেয়ে তাদের পক্ষে এটি বলা সহজ।
অ্যান্ডি ই

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

4
@ অ্যান্ডি আমি কী আরও ঝামেলা করছে তা দেখতে আরও কিছুটা পড়তে পেরেছি। আইএমও, এটি জেএসের "সত্য" ওওপি আছে বা অন্য ভাষার তুলনায় আমরা সঠিকভাবে কোনওটিকে "পদ্ধতি" বলতে পারি কিনা তা এই জাতীয় সমস্যার মতো like অ্যাসাইনমেন্ট অপারেটর আচরণের পারফরম্যান্স-স্লেয়িং ব্রাঞ্চিংয়ের সাথে ক্লোজার-ভিত্তিক ভাষায় এর অনুলিপি পয়েন্টারটিকে ওভাররাইট না করে মেশিনে একই বিষয়টিতে সরাসরি লেখা হিসাবে ভার্সকে আচরণ করা ঠিক হবে বলে আমি নিশ্চিত নই। জেএস বনাম অন্যান্য ভাষায় আমরা যা বোঝাতে চাইছি তার মধ্যে কেবল আসল আচরণের পার্থক্য হল আপনি যখন অ্যাসাইনমেন্ট অপারেটরটি ব্যবহার করবেন তখন কি হয় happens
এরিক রেপেন

16

এটা ব্যবহার কর

x = Object.create(x1);

xএবং x1দুটি পৃথক বস্তু হবে, পরিবর্তন পরিবর্তন xহবে নাx1


আমি অবজেক্ট.সেসাইন () ব্যবহার করে শেষ করি। সাধারণ পরীক্ষার ক্ষেত্রে, .create () কাজ করে তবে আরও জটিল (যা আমি প্যাটার্নটি এখনও খুঁজে পাচ্ছি না), এটি এখনও একই ঠিকানার উল্লেখ করে।
কুইসক্স

4
এটি কেবলমাত্র পরিবর্তিত হবে না যদি অবজেক্টের মানগুলি রেফারেন্স দ্বারা সংরক্ষণ করা হয় না যেমন তারা সংখ্যা বা বুলিয়ানের মতো প্রাকৃতিক ডেটা টাইপ। উদাহরণস্বরূপ, a = {x: [12], y: []} এর নীচে কোডটি বিবেচনা করুন; খ = অবজেক্ট.ক্রিয়েট (ক); bxpush (12); কনসোল.লগ (কুড়াল);
জাজাগওয়ে ডেনিস

8

জাভাস্ক্রিপ্ট সর্বদা মান দ্বারা পাস। oএক্ষেত্রে এটি বেনামে ফাংশনে রেফারেন্সের একটি অনুলিপি প্রদান করছে । কোডটি রেফারেন্সের একটি অনুলিপি ব্যবহার করছে তবে এটি একক বস্তুকে রূপান্তর করছে। মান বাদে জাভাস্ক্রিপ্ট পাস করার কোনও উপায় নেই।

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

function ShallowCopy(o) {
  var copy = Object.create(o);
  for (prop in o) {
    if (o.hasOwnProperty(prop)) {
      copy[prop] = o[prop];
    }
  }
  return copy;
}

4
+1 "সর্বদা মান দিয়ে যায়" এর জন্য যদিও আমি বস্তু ভাগ করে নেওয়ার মাধ্যমে কল ব্যবহার করতে পছন্দ করি ("রেফারেন্সের দ্বারা মূল্যকে কল করুন " এর বিপরীতে) এবং "মানটিকে" নিজেই "অবজেক্টে" প্রচার করি (নোটের সাথে যে তথ্যগুলি কেবল অনুলিপি করা / ক্লোন করা / নকল করা হয়নি) কারণ উল্লেখগুলি কেবলমাত্র একটি বাস্তবায়নের বিশদ এবং জাভাস্ক্রিপ্টের (বা স্পেসিফিকেশনে সরাসরি উল্লিখিত!) প্রকাশিত হয় না।

আমি একটি রিমোট সংযোগ থেকে প্রাপ্ত বস্তুর সাথে সম্পত্তি যুক্ত করতে আমার একটি সমস্যা হয়েছিল (আমি ভেবেছিলাম যে এই সমস্যাটি হতে পারে যে আমি সেই বস্তুর সাথে কোনও সম্পত্তি যুক্ত করতে সক্ষম নই) তাই আমি এই অগভীর প্রতিবেদনটি চেষ্টা করেছি এবং এই ত্রুটি পেয়েছি - অবজেক্ট প্রোটোটাইপ কেবলমাত্র অনুলিপি অবজেক্ট বা নকল হতে পারে var copy = Object.create (o); আমার সমস্যাটি কীভাবে সমাধান করবেন সে সম্পর্কে কোনও ধারণা
হর্ষিত লাডधा

এটি কি গভীর অনুলিপি নয়?
নদীর

@ রিভারটাম না, এটি কোনও গভীর অনুলিপি নয়, কারণ এটি বস্তুর মধ্যে থাকা বস্তুগুলিকে ক্লোন করে না। তবে আপনি কেবল এটিকে প্রতিটি সাব-অবজেক্টে পুনরাবৃত্তভাবে কল করে এটি একটি গভীর অনুলিপি তৈরি করতে পারেন
এবিপারসন

7

JQuery ব্যবহারকারীদের বিবেচনা হিসাবে, ফ্রেমওয়ার্কটি ব্যবহার করে একটি সহজ উপায়ে এটি করার একটি উপায়ও রয়েছে। JQuery আমাদের জীবনকে আরও সহজ করে তুলেছে কেবল অন্য কোনও উপায়ে।

var oShallowCopy = jQuery.extend({}, o);
var oDeepCopy    = jQuery.extend(true, {}, o); 

তথ্যসূত্র:


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

4
:) সঠিক কার্যকারিতা সন্ধান করে এটি জুড়ে এসেছিল। মূল অবজেক্টটি অব্যাহত রেখে জমা দেওয়ার আগে আমার কাছে সম্পাদনার জন্য অনুলিপি করার জন্য আমার একটি ডেটা অবজেক্ট ছিল। আমি নেটিভ জেএস সমাধানটি পছন্দ করি এবং এটি আমার নিজস্ব বেস লাইব্রেরিতে ব্যবহার করব, তবে jQuery সমাধানটি আমার অস্থায়ী সমাধান। গৃহীত উত্তর চমত্কার। : ডি
ব্রেট ওয়েবার

6

আসলে, জাভাস্ক্রিপ্ট সর্বদা মান দ্বারা পাস হয় । তবে অবজেক্টের রেফারেন্সগুলি মান হওয়ায় বস্তুগুলি যেমন রেফারেন্সের মাধ্যমে পাস হয় তেমন আচরণ করবে ।

সুতরাং এটিকে ঘুরে দেখার জন্য , জেএসএন ব্যবহার করে উভয়টি অবজেক্টটি স্ট্রাইফাই করুন এবং এটিকে আবার পার্স করুন । নীচের কোডের উদাহরণ দেখুন:

var person = { Name: 'John', Age: '21', Gender: 'Male' };

var holder = JSON.stringify(person);
// value of holder is "{"Name":"John","Age":"21","Gender":"Male"}"
// note that holder is a new string object

var person_copy = JSON.parse(holder);
// value of person_copy is { Name: 'John', Age: '21', Gender: 'Male' };
// person and person_copy now have the same properties and data
// but are referencing two different objects

4
হ্যাঁ, এটি সরল রূপান্তর / পুনরায় রূপান্তর করার জন্য একটি বিকল্প। সাধারণত, স্ট্রিংগুলির সাথে কাজ করা খুব অদক্ষ; যদিও আমি জেএসএন পার্সিংয়ের কার্যকারিতা কিছু সময়ের জন্য মূল্যায়ন করি নি। মনে রাখবেন যে এটি সাধারণ অবজেক্টগুলির জন্য কাজ করার সময়, অবজেক্টগুলিতে মান হিসাবে ফাংশন রয়েছে, সামগ্রীটি হারাবে।
ভোলআরন

আমি আসলে এটি বেঞ্চমার্ক করেছি এবং অন্যকে এটি করতে দেখেছি, এবং জাভাস্ক্রিপ্টস জেসন ইঞ্জিনে দক্ষতার কারণে এই পদ্ধতিটি একটি বড় লাইব্রেরি না নিয়ে, প্রচুর কোড না লিখে বা না করে আপনি এটি করতে পারেন এমন দ্রুততম উপায়গুলির মধ্যে একটি is একটি সত্য গভীর অনুলিপি।
tedivm

4

obj2 = { ...obj1 } উইলের মতো স্প্রেড অপারেটর ব্যবহার করে একই মান থাকবে তবে ভিন্ন রেফারেন্স রয়েছে


4
এখানে জাভাস্ক্রিপ্ট নতুন। স্প্রেড অপারেটর রেফারেন্স দ্বারা অনুলিপি করার পরিবর্তে নতুন মান তৈরি করে? তাহলে কেন এই ডাউনভোটেড ছিল?
jo3birdtalk

4
প্রথম নজরে, এটি আমার জন্য কার্যকর হয়। তবে আমি আবিষ্কার করেছি এটি কেবল ভেরিয়েবলের প্রথম স্তরটিতে রয়েছে। উদাহরণস্বরূপ, এটি কখন কার্যকর let a = {value: "old"} let b = [...a] b.value = "new"হবে এবং কখন হবে {value: "old"}, বি হবে {value: "new"}। তবে এটি কখন কার্যকর let a = [{value: "old"}] let b = [...a] b[0].value = "new"হবে না এবং কখন হবে [{value: "new"}], খ হবে [{value: "new"}]
ব্র্যাডি হুয়াং

হ্যাঁ এটি অগভীর অনুলিপি করে। আপনি যদি নেস্টেট অবজেক্ট থাকে তবে আপনি গভীর কপিটি করতে চাইবেন। সরলতার জন্য আপনি লোডাশের ক্লোন এবং ডিপক্লোন ফাংশন ব্যবহার করতে পারেন
গীতাংশু গুলতি

3

আমার মূল্য দিয়ে কোনও বস্তু অনুলিপি করা দরকার (রেফারেন্স নয়) এবং আমি এই পৃষ্ঠাটি সহায়ক বলে মনে করেছি:

জাভাস্ক্রিপ্টে কোনও বিষয় গভীরভাবে ক্লোন করার সবচেয়ে কার্যকর উপায় কী? । বিশেষত, জন রেসিগের দ্বারা নিম্নলিখিত কোড সহ কোনও বস্তুর ক্লোনিং করা:

//Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

প্রশ্নটি জাভাস্ক্রিপ্ট সম্পর্কে, jQuery লাইব্রেরি নয়।
j08691

4
সত্য, এমন লোকদের জন্য যারা জেকারি ব্যবহার করতে পারবেন না কারণেই এটি তাদের সহায়তা করে না। যাইহোক, জ্যাকুই একটি জাভাস্ক্রিপ্ট লাইব্রেরি হিসাবে, আমার মনে হয় এটি এখনও বেশিরভাগ জাভাস্ক্রিপ্ট ব্যবহারকারীদের সহায়তা করবে।
বীপপপ

এটি সার্ভারে এটি করার চেষ্টা করা কোনও প্রোগ্রামারকে সহায়তা করবে না। তাই - না। এটি কোনও বৈধ উত্তর নয়।
টমাসজ গাভোকস্কি

3

ES6 সিনট্যাক্স সহ:

let obj = Object.assign({}, o);


4
@Galkowskit খুব ভাল উল্লেখ। এর সাথে সবচেয়ে বড় সমস্যা (আরও ভাল: লক্ষ্য করার মতো বিষয় ) Object.assignএটি একটি গভীর অনুলিপি সম্পাদন করে না।
ভোলআরন

1

আপনি এটিতে সিদ্ধ হয়ে গেলে, এটি মাত্র একটি অভিনব মাত্রাতিরিক্ত জটিল প্রক্সি, তবে সম্ভবত ক্যাচ-সমস্ত প্রক্সি এটি করতে পারে?

var o = {
    a: 'a',
    b: 'b',
    func: function() { return 'func'; }
};

var proxy = Proxy.create(handlerMaker(o), o);

(function(x){
    var obj = x;
    console.log(x.a);
    console.log(x.b);
    obj.foo = 'foo';
    obj.bar = 'bar';
})(proxy);

console.log(o.foo);

function handlerMaker(obj) {
  return {
   getOwnPropertyDescriptor: function(name) {
     var desc = Object.getOwnPropertyDescriptor(obj, name);
     // a trapping proxy's properties must always be configurable
     if (desc !== undefined) { desc.configurable = true; }
     return desc;
   },
   getPropertyDescriptor:  function(name) {
     var desc = Object.getOwnPropertyDescriptor(obj, name); // not in ES5
     // a trapping proxy's properties must always be configurable
     if (desc !== undefined) { desc.configurable = true; }
     return desc;
   },
   getOwnPropertyNames: function() {
     return Object.getOwnPropertyNames(obj);
   },
   getPropertyNames: function() {
     return Object.getPropertyNames(obj);                // not in ES5
   },
   defineProperty: function(name, desc) {

   },
   delete:       function(name) { return delete obj[name]; },   
   fix:          function() {}
  };
}

রিচার্ড, আমি প্রতিক্রিয়া জানাতে কিছুটা দেরি করেছি :) তবে আমি মনে করি আমি কয়েকটি কারণে কখনই করিনি: আমি সিনট্যাকটিক চিনির সন্ধান করছিলাম যা জেএসকে বিভিন্ন উপায়ে পাস করার ক্ষমতা দিয়েছিল; আপনার উত্তরটি দীর্ঘ দেখাচ্ছে, এবং আপনার "প্রক্সি" ব্যবহারের জন্য আমাকে ঝুলিয়ে রাখা হয়েছিল। 3 বছর পরে এবং আমি এখনও ব্যবহারের জন্য স্তব্ধ আছি। সম্ভবত আমি ক্লাসে যথেষ্ট মনোযোগ দিইনি, তবে নেটওয়ার্কিংয়ের মতো, আমি ভেবেছিলাম সিএসে প্রক্সিগুলি মধ্যস্থতাকারী হিসাবে কাজ করবে বলে মনে করা হচ্ছে। সম্ভবত এটি এখানেও আছে এবং আমি এটির মধ্যস্থতা কী তা নিয়ে সঠিকভাবে চিন্তা করছি না।
ভোলআরন

0

আপনি যদি লড্যাশ ব্যবহার করছেন বা npmঅবজেক্টের সমস্ত বৈশিষ্ট্যকে একটি নতুন খালি অবজেক্টে গভীরভাবে অনুলিপি করতে লোডাশের মার্জ ফাংশনটি ব্যবহার করুন:

var objectCopy = lodash.merge({}, originalObject);

https://lodash.com/docs# विसর

https://www.npmjs.com/package/lodash. নিম


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