2013-04-04 13 views
5

के उदाहरण में जेएसओएन स्ट्रिंग को बदल रहा है मेरे पास एक विशिष्ट प्रारूप में AJAX कॉल से लौटा JSON स्ट्रिंग का एक गुच्छा है और जब उन्हें सभी को अपने स्वयं के जावास्क्रिप्ट ऑब्जेक्ट में परिवर्तित करना शुरू होता है, तो मुझे आश्चर्य होता है कि कोई आसान तरीका है या नहीं चूंकि हम यहां जावास्क्रिप्ट से बात कर रहे हैं।जावास्क्रिप्ट फंक्शन

मैं var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; होगा और मैं आसानी से अपने कार्यों के साथ इन वस्तुओं में से प्रत्येक सहयोगी ताकि मैं जैसे काम कर सकें करना चाहते हैं:

myClass.prototype.doSomething = function() { 
    // do something to this.name 
}; 

$.each(manyOfThem, function(index, item) { 
    item.doSomething(); 
}); 

मुझे लगता है कि मेरी चिंता का विषय है, मैं नहीं चाहता धन्यवाद

var myClass = function(item) { 
    this.name = item.name; 
    // do the same for the rest of item's potentially 20 properties 
}; 

var oneOfThem = new myClass(manyOfThem[0]); // I think this is redundant.... 
oneOfThem.doSomething(); 

किसी भी तरह, अगर वहाँ भी है (सुरक्षा?) कारण मैं सिर्फ रूप में अच्छी तरह का हिस्सा कृपया इसे चूसना अप करने के लिए है और उन सब मैन्युअल रूप से करना चाहते हैं,: (इसके दोहराव क्योंकि) इस करते हैं!

+0

मैं यह क्या आप 'doSomething' में करना चाहते हैं पर निर्भर करता है लगता है। क्या आप अपनी योजना क्या साझा कर सकते हैं? जैसे आप 'doSomething'' नामक 'फ़ंक्शन' क्यों नहीं बना सकते और इसे 'item' पास नहीं कर सकते? – Ian

+0

आप हमेशा 'myClass' को एक सरणी स्वीकार कर सकते हैं (' इस मामले में 'manyOfThem')। फिर, जब आप अपने किसी एक आइटम में हेरफेर करना चाहते हैं (कुछ 'doSomething' फ़ंक्शन को कॉल करना), तो आप 'myClass.do कुछ (3)' को तीसरी अनुक्रमणिका का अर्थ दे सकते हैं। फिर आंतरिक रूप से, यह सरणी में तीसरे आइटम (सरणी को उजागर किए बिना) पर काम करेगा। – Ian

+0

@ian Well, यह वास्तव में कुछ भी हो सकता है, और यदि कुछ भी बाहर कुछ काम करता है तो यह 1 होगा। वैश्विक नामस्थान में 2. काउंटर-ऑब्जेक्ट उन्मुख डिजाइन – Lim

उत्तर

3

तुम्हारा मतलब है, की तरह कुछ (jsfiddle देखें):

var MyClass = function() {}; 
MyClass.prototype = { 
    doSomething: function() { 
     alert(this.name); 
    } 
}; 

फिर

var manyObj = $.map(manyOfThem, function(obj) { 
    return $.extend(new MyClass(), obj); 
}); 

तो तुम फोन कर सकते हैं:

manyObj[0].doSomething(); // alert("a") 

हालांकि, इस पद्धति एक सीधा सुरक्षित नहीं करेगा manyOfThem ऑब्जेक्ट के साथ प्रतिलिपि बनाएँ। । (उपरोक्त उदाहरण में, बदल रहा manyOfThem[0].name = "foo";manyObj[0] को प्रभावित नहीं करेगा और manyObj[0].doSomething(); के लिए एक कॉल अभी भी चेतावनी "a" अपने वस्तु के लिए एक सीधा संदर्भ संरक्षित करने के लिए होगा, ऐसा करते हैं:

var manyObj = $.map(manyOfThem, function(obj) { 
    function F() {}; 
    F.constructor = MyClass; 
    F.prototype = obj; 
    $.extend(F.prototype, new MyClass()); 
    return new F(); 
}); 


manyObj[0].doSomething(); // alert("a") 

manyOfThem[0].name = "foo"; // modify the referenced object 

manyObj[0].doSomething(); // alert("foo") ..also modifies the behaviour of the instance 
+0

हाय, बहुत धन्यवाद, मुझे लगता है कि विस्तार फ़ंक्शन वह कुंजी है जिसे मैं ढूंढ रहा हूं। लेकिन मेरे ऑब्जेक्ट के प्रत्यक्ष संदर्भ को संरक्षित करने के लिए, क्या मैं आपके साथ पुष्टि कर सकता हूं कि प्रोटोटाइप में 'इवेंट' जैसे आवृत्ति चर भी होंगे।नाम 'और _can_ को' एफ.प्रोटोटाइप 'में पूरी तरह से कॉपी किया जा सकता है? – Lim

+1

हां, किसी भी फ़ंक्शन या प्रॉपर्टी को परिभाषित किया गया है जिसे ऑब्जेक्ट पर कॉपी किया जाएगा। उदाहरण के लिए, ऑब्जेक्ट क्लोनिंग का उपयोग करके किया जाता है: 'var clone = $ .extend ({}, sourceObj); '। इस मामले में, 'F.prototype 'अज्ञात वर्ग स्तर फ़ंक्शन कन्स्ट्रक्टर के रूप में कार्य करता है ताकि आपके' manyOfThem' ऑब्जेक्ट्स का उपयोग टेम्पलेट्स के रूप में नए प्रोटोटाइप बनाने के लिए किया जा सके, फिर उन्हें 'MyClass' के नए उदाहरणों के साथ विस्तारित किया जा सके (इसलिए उनमें से प्रत्येक के पास अलग-अलग स्कॉप्स हैं)। –

+0

मुझे ईमानदार होना होगा और कहें कि मुझे अभी भी ऑब्जेक्ट इंस्टेंस गुणों की अवधारणा को 'प्रोटोटाइप' में कॉपी नहीं किया गया है, लेकिन अनुमान लगाएं कि अर्थशास्त्र जो भी करता है, वही है। आपके उत्तर के लिए बहूत बहूत धन्यवाद! – Lim

0

आप क्या कर सकते हैं

var myClass = function(item){ 
    for(i in item){ 
     if (item.hasOwnProperty(i)){ 
      this[i] = item[i]; 
     } 
    } 
}; 

यह myClass निर्माता में दोहराव कार्य कम करना चाहिए।

एक वर्ग का उपयोग किए बिना
2

एक समाधान

०१२३५१६४१०६ है
var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; 

function doSomething(){ 
    console.log(this.name) 
} 

$.each(manyOfThem, function(index, item) { 
    doSomething.call(item); 
}); 

डेमो: Fiddle

आप प्रकार MyClas का एक उदाहरण बनाने के लिए चाहते हैं, तो

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; 

function MyClass(item){ 
    $.extend(this, item); 
} 

MyClass.prototype.doSomething = function(){ 
    console.log(this.name) 
} 

$.each(manyOfThem, function(index, item) { 
    var obj = new MyClass(item); 
    obj.doSomething() 
}); 

डेमो: Fiddle

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