2011-07-08 17 views
12

मैंने निम्न कोड को किसी ऑब्जेक्ट से "पॉप" करने के लिए लिखा था जैसे कि यह एक सरणी थी। इस कोड की तरह है कि जायेगा मुझे और अधिक गंभीर प्रोग्रामर द्वारा थप्पड़ मारा तरह लग रहा है, तो मैं सोच रहा था यह करने के लिए उचित तरीका है क्या:ऑब्जेक्ट से जावास्क्रिप्ट "पॉप"

// wrong way to pop: 
for(key in profiles){ 
    var profile = profiles[key]; // get first property 
    profiles[key] = 0;   // Save over property just in case "delete" actually deletes the property contents instead of just removing it from the object 
    delete profiles[key];   // remove the property from the object 
    break;      // "break" because this is a loop 
} 

मैं उपर्युक्त जाना चाहिए था, कि एक सच्चे "पॉप" के विपरीत , मुझे किसी विशेष क्रम में आने के लिए वस्तुओं की आवश्यकता नहीं है। मुझे बस एक निकालने की आवश्यकता है और इसे अपने मूल वस्तु से हटा दें।

+2

लपेटें शरीर टूट जाता है JQuery एक 'अगर (profiles.hasOwnProperty (कुंजी में) {..' और ढीली' = 0' –

+4

आप वास्तव में क्या करने की कोशिश कर रहे हैं? किसी ऑब्जेक्ट में जो पहली संपत्ति जोड़ा गया था उसे हटाएं? यह आवश्यक रूप से काम नहीं करेगा, जिस क्रम में 'for..in' लूप में गुणों को पुनर्प्राप्त किया गया है, इसकी गारंटी नहीं है। इसके अलावा आपको यह सुनिश्चित करने के लिए 'हैऑनप्रॉपर्टी' का उपयोग करना चाहिए कि यह प्रोटोटाइप का हिस्सा नहीं है, और आपको किसी ऑब्जेक्ट से किसी संपत्ति को निकालने के लिए 'हटाएं' के अलावा कुछ भी करने की आवश्यकता नहीं है। –

उत्तर

13
for(key in profiles){ 

बनाने आप वास्तव में एक var रूप key घोषित करना चाहिए बिना यह करने के लिए कोई रास्ता नहीं है।

profiles[key] = 0;   // Save over property just in case "delete" actually deletes the property contents instead of just removing it from the object 

अनावश्यक है। हटाएं संपत्ति के मूल्य को स्पर्श नहीं करती है (या उस संपत्ति के मामले में जिसमें एक सेटटर है लेकिन कोई गेटर नहीं है, यहां तक ​​कि इसकी आवश्यकता भी है)।

यदि ऑब्जेक्ट के प्रोटोटाइप पर कोई समरूप गुण है, तो यह कुछ अजीब करेगा। पर विचार करें एक वस्तु में

Object.prototype.foo = 42; 

function pop(obj) { 
    for (var key in obj) { 
    // Uncomment below to fix prototype problem. 
    // if (!Object.hasOwnProperty.call(obj, key)) continue; 
    var result = obj[key]; 
    // If the property can't be deleted fail with an error. 
    if (!delete obj[key]) { throw new Error(); } 
    return result; 
    } 
} 

var o = {}; 
alert(pop(o)); // alerts 42 
alert(pop(o)); // still alerts 42 
2

for in लूप के लिए जो कुछ भी देता है, उसके ब्राउज़र में कोई "सही" ऑर्डर नहीं होता है। कुछ उन्हें क्रम में क्रम में करते हैं, अन्य इसे संख्यात्मक सूचकांक पहले करते हैं। तो वहाँ वास्तव में अपने स्वयं के कस्टम वस्तु

4

गुण एक ढेर में संग्रहीत नहीं हैं तो मूल अवधारणा (ऊपर टिप्पणी में उल्लेख अन्य मुद्दों को छोड़ कर) मज़बूती से काम नहीं करेगा।

यदि आपको वास्तव में इस तरह के निर्माण की आवश्यकता है तो ऐसा कुछ करने का प्रयास करें।

var ObjectStack = function(obj) { 
    this.object = obj; 
    this.stack=[]; 
}; 
ObjectStack.prototype.push = function(key,value) { 
    this.object[key]=value; 
    this.stack.push(key); 
}; 
ObjectStack.prototype.pop = function() { 
    var key = this.stack.pop(); 
    var prop = this.object[key]; 
    delete this.object[key]; 
    return prop; 
}; 

var my_obj = {}; 
var my_stack = new ObjectStack(my_obj); 
my_stack.push("prop1",val1); 
my_stack.push("prop2",val2); 

var last_prop = my_stack.pop(); //val2 

डेमो: http://jsfiddle.net/a8Rf6/5/

+0

इस कार्यान्वयन के साथ एक समस्या यह है कि हम एक ढेर कर रहे हैं, लेकिन inte rnal सरणी सार्वजनिक है। कोई भी इसे किसी भी रूप में बदल सकता है, या इसे किसी अन्य चीज़ के साथ भी बदल सकता है जो कि सरणी नहीं है। – yckart

+3

जावास्क्रिप्ट मूल रूप से गतिशील है। यदि मैं चुनता हूं तो मैं 'Array.prototype.length' बदल सकता हूं। हालांकि आंतरिक ढेर को छुपाने के लिए एक बंद करने का उपयोग करके एक और जटिल कार्यान्वयन करना संभव है, यह एक सीखने का उदाहरण है, और व्यावहारिक रूप से यह एक बहुत ही अतिरिक्त कोड है जिससे आप स्वयं से इस तरह से रक्षा कर सकें कि मूल भाषा वैसे भी नहीं है। –

1

आप इस तरह पॉप विधि बनाने में सक्षम हैं:।

Object.defineProperty(Object.prototype, 'pop',{ 
    writable: false 
    , configurable: false 
    , enumerable: false 
    , value: function (name) { 
     var value = this[name]; 
     delete this[name]; 
     return value; 
    } 
}); 
कुछ बस Object.prototype.pop = समारोह का उपयोग कर कारण के लिए

...

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