2009-10-07 15 views
11

पायथन में आप किसी अज्ञात विशेषताओं को प्रोग्रामेटिक तरीके से हल करने के लिए __getattr__(self,key) विधि वाले किसी ऑब्जेक्ट को परिभाषित कर सकते हैं, लेकिन जावास्क्रिप्ट में आप केवल पूर्व परिभाषित विशेषताओं के लिए गेटर्स और सेटर्स को परिभाषित कर सकते हैं। क्या जावास्क्रिप्ट में पूर्व चीज को पूरा करने का एक सामान्य तरीका है?क्या कोई जावास्क्रिप्ट पाइथन की __getattr__ विधि के बराबर है?

नमूना कोड ख़ाली जैसा होगा:

function X() {}; 
X.prototype={ 
    __getattr__:function(attrname) { 
    return "Value for attribute '"+attrname+"'"; 
    } 
} 

x=new X() 
alert(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'" 

कुंजी बिंदु विशेषता प्रोग्राम के रूप में विशेषता का नाम के आधार पर का मूल्य हो रही है। प्री-सेटिंग विशेषता मदद नहीं करती है क्योंकि init के दौरान कोई जानकारी नहीं है कि किस गुण का अनुरोध किया जा सकता है।

उत्तर

8

दुर्भाग्य से इस सवाल का जवाब नहीं। देखें Python's __getattr__ in Javascript

आप __defineGetter__ मिल गया है है, लेकिन जैसा कि आप का उल्लेख किया आप विशेषता आप तक पहुँचने की जाएगी का नाम पता करने की जरूरत है।

जिस तरह से मुझे लगता है कि आपको लगता है कि __getattr__ (__getitem__ उन चीज़ों के लिए है जिन्हें आप [] के साथ एक्सेस करना चाहते हैं)।

+0

धन्यवाद। हाँ, यह बल्कि __getattr__ –

+3

@Roatin क्यों होगा !!!! जेएस को किसी भी अन्य फीचर की तुलना में इसकी आवश्यकता है ('कम चूसने' सुविधा को छोड़कर जो लोग एक दशक के लिए अनुरोध कर रहे हैं)। – orokusaki

22

अब यह संभव है यदि आपके ब्राउज़र को ES6 प्रॉक्सी सुविधा के लिए समर्थन है। आप इसे ECMAScript 6 compatibility table में देख सकते हैं।

आप प्रॉक्सी समर्थन है, तो आप इसे इस प्रकार का प्रयोग करेंगे:

क्रोम में
let handler = { 
    get(target,name) { 
    return `Value for attribute ${name}` 
    } 
} 

let x = new Proxy({},handler); 
console.log(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'" 

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

+0

पवित्र बकवास मैं इसके लिए इंतजार कर रहा था !!! –

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