2009-06-15 12 views
35

लंबी कहानी छोटी: मैं ऐसी परिस्थिति में हूं जहां मुझे एक PHP-शैली गेटटर चाहिए, लेकिन जावास्क्रिप्ट में।सभी गुणों के लिए जावास्क्रिप्ट गेटर

मेरी जावास्क्रिप्ट केवल फ़ायरफ़ॉक्स में चल रही है, इसलिए मोज़िला विशिष्ट जेएस मेरे द्वारा ठीक है।

जेएस गेटटर बनाने के लिए मुझे एकमात्र रास्ता मिल सकता है, इसके नाम को निर्दिष्ट करने की आवश्यकता है, लेकिन मैं सभी संभावित नामों के लिए गेटर को परिभाषित करना चाहता हूं। मुझे यकीन नहीं है कि यह संभव है, लेकिन मुझे बहुत कुछ पता होना चाहिए।

+6

मुझे लगता है कि वह जादू कार्यों का जिक्र कर रहा है __get और __set – seanmonstar

उत्तर

44

निकटतम आप पा सकते हैं __noSuchMethod__, जो जावास्क्रिप्ट के PHP के __call() के बराबर है।

दुर्भाग्यवश, __get/__ सेट के बराबर नहीं है, जो शर्म की बात है, क्योंकि उनके साथ हम __noSuchMethod__ लागू कर सकते थे, लेकिन मुझे अभी तक __noSuchMethod__ का उपयोग करके गुणों (सी # में) लागू करने का कोई तरीका नहीं दिखाई देता है।

var foo = { 
    __noSuchMethod__ : function(id, args) { 
     alert(id); 
     alert(args); 
    } 
}; 

foo.bar(1, 2); 
+1

मैं वास्तव में एक "संदेश खाने की शून्य" बनाने की कोशिश कर रहा था, और यह * बिल्कुल * करता है! धन्यवाद! – arantius

+0

मुझे "संदेश खाने की शून्य" अवधारणा के बारे में कोई जानकारी नहीं थी। धन्यवाद –

+0

अबज के बारे में क्या? उन्हें अपने आरपीसी-स्टाइल ढांचे को वास्तव में काम करने के लिए कुछ प्रकार के __set() और __get() समकक्ष का उपयोग करना होगा। मैं नहीं बता सकता कि यह स्रोत कोड से कैसे काम करता है। – BMiner

1

यदि आप PHP के __get() फ़ंक्शन जैसे कुछ ढूंढ रहे हैं, तो मुझे नहीं लगता कि जावास्क्रिप्ट ऐसा कोई भी निर्माण प्रदान करता है।

ऑब्जेक्ट के गैर-फ़ंक्शन सदस्यों के माध्यम से सबसे अच्छा मैं सोच सकता हूं और फिर प्रत्येक के लिए एक "getXYZ()" फ़ंक्शन बना रहा हूं।

कुशल छद्म-ish कोड में:

for (o in this) { 
    if (this.hasOwnProperty(o)) { 
     this['get_' + o] = function() { 
      // return this.o -- but you'll need to create a closure to 
      // keep the correct reference to "o" 
     }; 
    } 
} 
5

Javascript 1.5getter/settersyntactic sugar है। यह जॉन रेसिग here

वेब उपयोग के लिए पर्याप्त सामान्य नहीं है, लेकिन निश्चित रूप से फ़ायरफ़ॉक्स में है (यदि आप कभी भी सर्वर पक्ष पर इसका उपयोग करना चाहते हैं) तो यह बहुत अच्छी तरह से समझाया गया है।

+5

काफी __get() और __set() नहीं है। PHP का संस्करण आपको सभी गुणों की निगरानी करने देता है, यहां तक ​​कि उन लोगों को भी जिन्हें अभी तक नहीं बनाया गया है। – BMiner

5

तुम सच में एक कार्यान्वयन है कि काम करता है की जरूरत है, तो आप अपने रास्ते arround undefined के खिलाफ दूसरा पैरामीटर परीक्षण द्वारा "धोखा" कर सकता है, यह भी आप वास्तव में सेट पैरामीटर को पाने के इस्तेमाल कर सकते हैं मतलब है।

var foo = { 
    args: {}, 

    __noSuchMethod__ : function(id, args) { 
     if(args === undefined) { 
      return this.args[id] === undefined ? this[id] : this.args[id] 
     } 

     if(this[id] === undefined) { 
      this.args[id] = args; 
     } else { 
      this[id] = args; 
     } 
    } 
}; 
1

मैं अपना स्वयं का समाधान बनाने के लिए एक निकक्स के उत्तर का उपयोग कर समाप्त हुआ। मेरा समाधान स्वचालित रूप से get_ {propname} और set_ {propname} फ़ंक्शंस को सभी गुणों के लिए बना देगा। यह जांचता है कि क्या उन्हें जोड़ने से पहले फ़ंक्शन पहले से मौजूद है या नहीं। यह आपको ओवरराइट होने के जोखिम के बिना हमारे स्वयं के कार्यान्वयन के साथ डिफ़ॉल्ट प्राप्त या सेट विधि को ओवरराइड करने की अनुमति देता है।

for (o in this) { 
     if (this.hasOwnProperty(o)) { 
      var creategetter = (typeof this['get_' + o] !== 'function'); 
      var createsetter = (typeof this['set_' + o] !== 'function'); 
      (function() { 
       var propname = o; 
       if (creategetter) { 
        self['get_' + propname] = function() { 
         return self[propname]; 
        }; 
       } 
       if (createsetter) { 
        self['set_' + propname] = function (val) { 
         self[propname] = val; 
        }; 
       } 
      })(); 
     } 
    } 
32

Proxy ऐसा कर सकते हैं! मैं बहुत खुश हूँ यह मौजूद है !! एक उत्तर यहां दिया गया है: Is there a javascript equivalent of python's __getattr__ method?। अपने शब्दों में दोबारा लिखने के लिए:

var x = new Proxy({},{get(target,name) { 
    return "Its hilarious you think I have "+name 
}}) 

console.log(x.hair) // logs: "Its hilarious you think I have hair" 

जीत के लिए प्रॉक्सी! एमडीएन दस्तावेज़ देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

क्रोम, फ़ायरफ़ॉक्स और नोड.जे.एस. में काम करता है। Downsides: आईई में काम नहीं करता है - freakin आईई। शीघ्र।

+0

यह एज में भी काम करता है। विशिष्ट ब्राउज़र संस्करणों के लिए [caniuse.com] (https://caniuse.com/#feat=proxy) देखें। – styfle

13

आप ES6 में कोडिंग रहे हैं, तो आप php की तरह एक अच्छे लग कोड के लिए प्रॉक्सी और वर्ग को जोड़ सकते हैं:

class Magic { 
    constructor() { 
     return new Proxy(this, this); 
    } 
    get (target, prop) { 
     return this[prop] || 'MAGIC'; 
    } 
} 

इस हैंडलर को बांधता है, तो आप लक्ष्य के बजाय इसका उपयोग कर सकते हैं।

नोट: PHP के विपरीत, प्रॉक्सी सभी संपत्ति अनुरोध को संभालती है।

let magic = new Magic(); 
magic.foo = 'NOT MAGIC'; 
console.log(magic.foo); // NOT MAGIC 
console.log(magic.bar); // MAGIC 

आप देख सकते हैं जो समर्थन प्रॉक्सी http://caniuse.com/#feat=proxy और वर्ग http://caniuse.com/#feat=es6-class ब्राउज़र। नोड 8 दोनों का समर्थन करते हैं।

+0

यह मुझे मिला सबसे अच्छा जवाब है। –

+0

^यह प्रतिभा है – Ifnot

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