2012-01-19 11 views
10

मैं वस्तुओं का उपयोग कर रहा मेरी जावा स्क्रिप्ट कोड नाम स्थान के लिए। इन वस्तुओं को आम तौर पर कार्य करता है कि वस्तु ही apply का उपयोग करने के this -pointer मानचित्रण कहा जाता है होते हैं। हालांकि, मैं यह असुविधाजनक this -pointer हर मैं वस्तु के अन्य कार्यों या गुण उपयोग करना चाहते का उपयोग करने, विशेष रूप से, क्योंकि मामलों की बहुत सारी में मैं new -operator का उपयोग जिस तरह से आप वर्गों का प्रयोग करेंगे समारोह-वस्तुओं का उपयोग नहीं कर पाते। मैं new Line() बजाय अगर new this.Line() लेखन पसंद करेंगे।क्या आप गतिशील रूप से फ़ंक्शन में स्थानीय चर जोड़ सकते हैं?

यह बहुत अच्छा है अगर आप extract के साथ एक समारोह रास्ता php यह करता है करने के लिए स्थानीय चर जोड़ सकते हैं होगा

var sample_object = { 
    "some_function": function() {} 
} 

test() { 
    extract(sample_object); 
    some_function(); // imported from sample_object 
} 

है कि संभव है (स्यूडोकोड निम्नलिखित है, यह एक छोटे से अधिक जटिल है)?

+3

आप:

function smObject (object) { return function() { function getter(prop) { return function() { return this[prop]; } } function setter(prop) { return function(data) { this[prop]=data; } } for (var o = 0; o < object.length; o++) { this[object[o]] = {}; this['get' + object[o]] = getter(object[o]); this['set' + object[o]] = setter(object[o]); } } } 

अब आप इस तरह एक समारोह का दृष्टांत कर सकते हैं *सकता है* 'साथ' ब्लॉक का उपयोग करें, लेकिन, मैं इसका सुझाव नहीं देता हूं। मुझे यह भी लगता है कि इसे ES5 सख्त मोड में हटा दिया गया है। –

+1

@ रॉकेट मैं इसे भागने का सुझाव नहीं दूंगा अगर मैं कर सकता हूं :-) यह सच है कि यह काम करेगा, लेकिन 'साथ' भ्रमित और अजीब है। इसके अलावा मुझे पूरा यकीन है कि यह प्रदर्शन समस्याओं का कारण बनता है लेकिन मुझे इसके लिए स्पष्टीकरण याद नहीं है। – Pointy

+0

क्या होगा यदि आप एक सरणी को तर्क के रूप में पास करते हैं? – elvenbyte

उत्तर

3

विवादास्पद with है, जो कुछ great applications है, लेकिन मामूली धीमी गति से और त्रुटियों की संभावना है नहीं है। यह सख्त मोड में एक त्रुटि फेंकता है (जिसे आपको हमेशा चुनना चाहिए) और इसे बहिष्कृत किया जा रहा है।

var sampleObject = { 
    someFunction: function() {}, 
    b: 10 
} 

with (sampleObject) { 
    typeof someFunction // "function" 

    var a = 42 
    var b = 20 
} 

sampleObject.a // undefined 
sampleObject.b // 20 

ध्यान दें, कि नए एक with -block में निर्धारित वेरिएबल वस्तु को नहीं जोड़ा जाएगा। फिर भी, यदि ऑब्जेक्ट में पहले से ही एक नामांकित संपत्ति है, तो इस संपत्ति को संशोधित किया जाएगा (धन्यवाद, @Rocket)।

बस मज़ा के लिए, यहाँ an implementation of extract का उपयोग कर eval (जो भी अधिक with से बुराई है) है। यदि आपका वस्तु sampleObject['x; while (true) { alert("Hi!") }'] की तरह गुण है, उदाहरण के लिए इसके साथ अकथ्य कर सकते हैं,।

+1

आप किसी ऑब्जेक्ट में 'with' में चर जोड़ नहीं सकते हैं, लेकिन आप उन्हें संशोधित कर सकते हैं। इस उदाहरण की जांच करें: http://jsfiddle.net/HkEVW/ –

+0

@ रॉकेट, मूल्यवान स्पष्टीकरण, धन्यवाद! – katspaugh

4

मैं यकीन है कि eval अपने ही जवाब है हूँ, लेकिन आप जानते हैं कि आपके नियंत्रण शामिल के बाहर किसी भी इनपुट है, तो इसे सुरक्षित

function dynamicArgs (varName, varValue) { 
    eval("var " + varName + "=" + JSON.encode(varValue)); 
    alert(a); 
} 

dynamicArgs("a", "value"); 

नहीं है आप इस के साथ समस्या यह देख सकते हैं की जरूरत है। यदि आपका कार्य ज्ञात नहीं है तो आपका फ़ंक्शन गतिशील चर को कॉल करना चाहिए? मैंने इसे एक चर के लिए हार्डकोड किया क्योंकि मैं इसे कॉल करते समय इसे पास करता हूं, लेकिन यह एक अच्छा समाधान नहीं है। एकमात्र समाधान एक और eval होगा। आपको वास्तव में सोचना चाहिए कि आपको क्या करना है और क्या यह उपयोगी है। लेकिन यह करने योग्य है।यहाँ http://jsfiddle.net/mendesjuan/GG3Wu/

function dynamicArgs (varName, varValue) { 
    eval('var ' + varName + "='" + varValue + "';"); 
    alert(eval(varName)); 
} 

dynamicArgs("f", "Here I am"); 

अब यहाँ आप क्या कर रहे की तरह एक उदाहरण है, this.MyConstructor http://jsfiddle.net/mendesjuan/AK3WD/

var ns = { 
    MyConstructor: function(val) { 
     this.prop = val; 
    }, 

    runConstructor: function(val) { 
     var Ctor = "MyConstructor"; 
     eval('var ' + Ctor + ' = this.' + Ctor); 
     return new MyConstructor(val); 
    } 
} 


alert(ns.runConstructor("Hello").prop); 

से एक चर बनाने और एक उदाहरण है अगर तुम चाहते थे:

यहाँ यह कार्रवाई में है ऑब्जेक्ट से सभी मानों को दायरे में आयात करने के लिए;

http://jsfiddle.net/mendesjuan/AK3WD/1/

var ns = { 
    MyConstructor: function(val) { 
     this.val= val; 
    }, 

    anotherProperty: 5, 

    runConstructor: function(val) { 
     // Bring all the variables from this into this scope 
     for (var prop in this) { 
      eval('var ' + prop + ' = this.' + prop); 
     } 
     alert('Testing var anotherProperty: ' + anotherProperty); 
     var obj = new MyConstructor(val); 
     alert('Created MyConstructor: its prop is ' + obj.val) 
    } 
} 


ns.runConstructor("Hello"); 
2

इस तरह मैंने किया:

var fields = ['Name', 'Id', 'Other', '....' ] 
var MyFunction = smObject(fields); 
var myObject = new MyFunction(); 

// getter/setters 
myObject.setId(5); 
myObject.getId(); // will return 5 

सादर, Emanouil

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

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