2015-05-23 3 views
5

मैं slice() का उपयोग कर ऑब्जेक्ट्स की एक सरणी क्लोन कर रहा हूं लेकिन जब मैं उस क्लोन सरणी को किसी अन्य विधि में पास करता हूं तो सरणी की सामग्री उनके संदर्भ खो रही है और undefined बन जाती है।कॉफ़ीस्क्रिप्ट/जावास्क्रिप्ट क्यों, एक क्लोन सरणी में ऑब्जेक्ट्स किसी विधि को पारित होने पर उनके संदर्भ खोने लगते हैं?

class Chooser 
    constructor: (@order, @items) -> 
    # do stuff 

    choose: -> 
    console.debug "Choosing", @order.size, "from", @items.slice() 
    @process(@order.size, @items.slice()) 
    # do stuff 

    process: (count, items) -> 
    console.debug "count", count 
    console.debug "items", items 
    console.debug "@items", @items 
    # do recursive stuff that includes an items.shift() 

पहले console.debug मुझे देता है, के रूप में उम्मीद:

Choosing 10 items from [Item, Item] 

जहां Item और Item मैं वास्तव में क्या उम्मीद कर रहे हैं।

लेकिन फिर अगले console.debug लाइनों मुझे दे

count 10 
items [undefined x 2] 
@items [Item, Item] 

मैं समझता हूँ कि @items.slice()@items के उथले कॉपी बन जाती है, और जैसा कि सरणी के भीतर इस तरह की वस्तुओं में एक ही Item वस्तुओं के लिए संदर्भ। Item ऑब्जेक्ट्स अभी भी मौजूद हैं क्योंकि वे अभी भी मूल @items सरणी में हैं।

क्यों, क्लोन सरणी में ऑब्जेक्ट्स process विधि के भीतर एक बार अपने संदर्भ खोने लगते हैं?

देखें इस Working example of the problem converted to Javascript

+2

jsfiddle, jsbin, codepen, requirebin या कि और फिर जैसे कुछ पर चल रहे एक उदाहरण के लिए एक लिंक पोस्ट करें हमें बताएं कि आप क्या देखते हैं और इसके बजाय आप क्या उम्मीद करते हैं। यह किसी समस्या को डीबग करने के लिए बहुत अधिक समझ में नहीं आता है जो आप कहते हैं लेकिन टिप्पणियों में अन्य कहते हैं कि यह नहीं है। – rsp

+1

मैंने त्रुटि को पुन: उत्पन्न करने में कामयाब रहा है लेकिन एक समझदार यूआरएल उत्पन्न करने के लिए कॉफी स्क्रिप्ट साइट नहीं मिल सका। देखें [यह jsfiddle] (http://jsfiddle.net/k0quf8v2/) हालांकि कॉफी स्क्रिप्ट से जावास्क्रिप्ट में परिवर्तित किया गया है। यह त्रुटि को पुन: उत्पन्न करता है। –

+0

@ डेवसैग: मैं सुझाव देता हूं कि प्रासंगिक कोड को फिसल ** से ** प्रश्न में कॉपी करें, क्योंकि कोड में सरणी से प्रविष्टियों को हटाने में थोड़ा सा हिस्सा नहीं है, जो बाद में कंसोल के साथ समस्या का कारण बनता है। यह सुनिश्चित करता है कि भविष्य में लोगों के लिए प्रश्न उपयोगी रहें, क्योंकि बाहरी लिंक सड़ांध होते हैं, और एसओ अनिवार्य रूप से स्वयं निहित होने के लिए है। –

उत्तर

2

क्या अपने कोड में हो रहा है के लिए इस उत्तर देखें:

https://stackoverflow.com/a/24176638/635411

आप देख सकते हैं टुकड़ा करने की क्रिया ठीक काम कर रहा है:

var MyClass = (function() { 
 
    
 
    function MyClass(items) { 
 
    this.items = items; 
 
    } 
 
    
 
    MyClass.prototype.fn1 = function() { 
 
    console.log(this.items); 
 
    this.fn2(this.items.slice()); 
 
    }; 
 
    
 
    MyClass.prototype.fn2 = function(items){ 
 
    console.log(items); 
 
    }; 
 
    
 
    return MyClass; 
 
})(); 
 

 
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();

जो आप देख रहे हैं वह यह है कि आपके सरणी को कंसोल में विस्तारित करने से पहले स्थानांतरित किया जा रहा है। आप वास्तव में वस्तु stringify तो आप देख सकते हैं कि इसे सफलतापूर्वक में पारित किया गया था।

var MyClass = (function() { 
 
    
 
    function MyClass(items) { 
 
    this.items = items; 
 
    } 
 
    
 
    MyClass.prototype.fn1 = function() { 
 
    console.log(this.items); 
 
    this.fn2(this.items.slice()); 
 
    }; 
 
    
 
    MyClass.prototype.fn2 = function(items){ 
 
    console.log(items); 
 
    console.log(JSON.stringify(items, null, 2)); 
 
    items.shift(); 
 
    items.shift(); 
 
    }; 
 
    
 
    return MyClass; 
 
})(); 
 

 
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();

संबंधित मुद्दे