2010-07-02 7 views
7

में किसी ऑब्जेक्ट के प्रकार को बदलना मेरे पास JSON के साथ परिभाषित मौजूदा ऑब्जेक्ट की एक सरणी है। ऑब्जेक्ट्स ऑब्जेक्ट प्रकार के स्पष्ट रूप से हैं। उन्हें विशिष्ट कार्यक्षमता देने के लिए उन्हें कस्टम ऑब्जेक्ट प्रकार से कैसे जोड़ूं?जावास्क्रिप्ट

+0

यदि उस वस्तु अतिरिक्त गुण है/तरीकों, आपको और क्या चाहिए? क्या आप कुछ उदाहरण दे सकते हैं? – mykhal

+0

.. मेरा मतलब है, क्या आपके पास पहले से परिभाषित ऐसे कस्टम ऑब्जेक्ट प्रकार हैं या आप जानना चाहते हैं कि यह कैसे करें? – mykhal

उत्तर

11

तरीका है कि सभी ब्राउज़रों में काम करेंगे या तो गुण और विधियों आप चाहते हैं के साथ सरणी में प्रत्येक आइटम को बढ़ाने के लिए, या एक निर्माता के लिए वस्तु गुजरती हैं और एक नया वर्ष वस्तु के आधार पर वस्तु बनाने के लिए है गुण और तरीके।

या यदि आप IE के बारे में परवाह नहीं है: जेरेमी के जवाब देने के लिए एक पूरक के रूप में

var obj = { 
    name : "Jeremy" 
}; 

function CustomType() { 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
} 

CustomType.prototype.sayHi = function() { 
    alert(this.greeting + ", " + this.name); 
}; 

obj.__proto__ = CustomType.prototype; 
obj.constructor.call(obj); 

obj.sayHi(); 
+1

मुझे आईई के बारे में परवाह है, और मैं आपके सुझाव के साथ गया, एक ऐसी विधि तैयार करना जो पारित वस्तु को संशोधित करता है और उसे कॉलर पर वापस लौटाता है। मैं पर्ल में "आशीर्वाद" का उपयोग करने के लिए भी उपयोग किया जाता हूं और मेरी इच्छाओं पर वस्तुओं को संशोधित करने में सक्षम हूं। – Ray

4

मुझे विश्वास नहीं है कि ऑब्जेक्ट के प्रकार को बदलने के बाद कोई भी तरीका बदलने का कोई तरीका है। सौभाग्य से, आपको शायद अपनी वस्तुओं के वर्ग को बदलने की ज़रूरत नहीं है - आप शायद कुछ नई विधियों और अन्य कार्यक्षमताओं को ऑब्जेक्ट देने से संतुष्ट होंगे। (केवल वास्तविक अंतर यह है कि यदि आप कक्षा बदलते हैं, और अधिकांश लोग कोड चलाते समय कक्षाएं नहीं बदलते हैं।)

मैं आपके लिए एक उदाहरण काम करूंगा।

function Speaker() { 
    this.speak = function() { 
     window.alert("Hello, " + this.name); 
    } 
} 

यह:

var myobj = new Object() 
myobj.name = "Fred" 

तो मैं कुछ वर्ग है कि आप myobj को प्रदान करने में सक्षम होना चाहते हैं पैदा करेगा: सबसे पहले, मैं JSON ऑब्जेक्ट आप का प्रतिनिधित्व करने के लिए एक सरल वस्तु बना देंगे नई Speaker वर्ग कुछ उपयोगी कार्यक्षमता है:

var s = new Speaker() 
s.name = "Sally" 
s.speak() 

निष्पादित कि मीटर दिया: यह उत्पादन में उपयोगी जानकारी के लिए विधि speak() उपयोग कर सकते हैं ई संदेश "हैलो, सैली"। दुर्भाग्यवश, आप इस कार्यक्षमता के साथ एक नई वस्तु (जैसे s) नहीं चाहते हैं, तो आप मौजूदा ऑब्जेक्ट (myobj) चाहते हैं। यहाँ आप कैसे करना है कि:

myobj.speak = s.speak 

अब जब मैं इस पर अमल:

myobj.speak() 

मैं संदेश "हैलो, फ्रेड" देखें।

संक्षेप में: एक ऑब्जेक्ट बनाएं जो आप चाहते हैं। अपनी नई वस्तु में सभी विधियों (और किसी भी सहायक चर) को कॉपी करें। विरासत के कुछ असामान्य उपयोगों को छोड़कर, यह आपकी नई वस्तु वांछित के रूप में व्यवहार करेगा।

2

यदि आप उन पर एक विशिष्ट विधि का उपयोग करना चाहते हैं तो आप आवेदन/आवेदन का उपयोग कर सकते हैं।

या आप अपनी कस्टम ऑब्जेक्ट के लिए विधियों की प्रतिलिपि बना सकते हैं।

function Object1() { 
    this.aValue = "10"; 
} 

function CustomObject() { 
    this.customValue = "6"; 
} 

function convertToCustom(obj) { 
    var custom = new CustomObject(); 
    for(var key in obj) { 
    custom[key] = obj[key]; 
    } 
    return custom; 
} 

var obj = new Object1(); 
var custom = convertToCustom(obj); 

console.log(custom.customValue); // <- 6 
console.log(custom.aValue);  // <- 10 
0

, आप Object.create बजाय सीधे आद्य के साथ खेल का इस्तेमाल कर सकते हैं। आपको "विस्तार" फ़ंक्शन की भी आवश्यकता होगी।

तो, जेरेमी के उदाहरण दिए गए हैं, तो आप कुछ इस तरह हो सकता है:

var obj = { 
name : "Jeremy" 
}; 


function CustomType() { 
} 

CustomType.prototype.init = function(){ 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
    return this; //let's make it fluent 
} 

CustomType.prototype.sayHi = function() { 
    console.log(this.greeting + ", " + this.name); 
}; 

function extend(obj, props) { 
    for(prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      obj[prop] = props[prop]; 
     } 
    } 
    return obj; //let's make it fluent 
} 

obj = extend(Object.create(CustomType.prototype), obj).init(); 

obj.sayHi(); 
1

आप निर्माता की जरूरत नहीं है, तो आप क्या कर सकते हैं के रूप में:

Object.assign(new CustomType, {}); 
संबंधित मुद्दे