2009-10-13 11 views
6

यह जानने का एक तरीका है कि किस वर्ग के पास कोई फ़ंक्शन है? उदाहरण:जावास्क्रिप्ट - किसी फ़ंक्शन (विधि) के क्लास मालिक को प्राप्त करें

function globalFunc(){ 
//alert MyObject 
} 

function MyObject(){ 
} 
MyObject.prototype.test=function(){ 
globalFunc(); 
} 

var o=new MyObject(); 
o.test(); //alert MyObject 

अब इस समाधान का उपयोग कर im:

function globalFunc(){ 
alert(globalFunc.caller.__class__); 
} 

function MyObject(){ 
} 
MyObject.prototype.test=function(){ 
globalFunc(); 
} 
MyObject.prototype.test.__class__=MyObject; 

var o=new MyObject(); 
o.test(); //alert MyObject 

लेकिन वहाँ एक बड़ी समस्या है, यह देखने के लिए:

function globalFunc(){ 
alert(globalFunc.caller.__class__); 
} 

function MyObject(){ 
} 
MyObject.prototype.test=function(){ 
var temp=function(){ 
    globalFunc(); 
} 
temp(); 
    /* to simulate a simple closure, this may be for example: 
    element.addEventListener("click",temp,false); 
    */ 
} 
MyObject.prototype.test.__class__=MyObject; 

var o=new MyObject(); 
o.test(); //alert undefined 

तो, वहाँ इस प्राप्त करने के लिए एक स्पष्ट तरीका है ? मुझे पता है कि समस्या कहां है (वर्ग संपत्ति केवल परीक्षण की संपत्ति है और अस्थायी नहीं है), लेकिन मैं कक्षा भी temp में नहीं जोड़ सकता।

धन्यवाद।


उत्तर के लिए धन्यवाद, कुछ स्पष्टीकरण।

मैं निजी सदस्यों के साथ उन्मुख व्यक्तिगत फ्रैमवर्क ओओ करने की कोशिश कर रहा हूं।

तो:

globalFunc, एक विशेष समारोह है im इसे प्रयोग "निजी" संपत्ति प्राप्त करने के लिए और मैं कॉल विधि के साथ यह फोन नहीं कर सकते हैं या कुछ तर्क गुजर, केवल तर्क im पास होना जरूरी है "इस":

उदाहरण के लिए, $() वैश्विक

Class({ 
    public:{ 
     MyClass:function(){ 
     }, 

     setName:function(name) { 
      $(this).name=name; //set the private var name 
     }, 
     getName:function(){ 
      return $(this).name; 
     } 
    }, 
    private:{ 
     name:"UNKNOWN" 
    } 
}) 

var o=new MyClass(); 
o.getName(); // UNKNOWN 
o.setName("TEST!!!"); 
o.getName(); // TEST!!! 
o.name; //undefined 
$(o).name; //undefined 

विरासत के साथ काम करता है करने के लिए है, $(), मैं पता है कि वर्ग यह और वर्ग की वस्तु फोन की जरूरत है।

सभी अच्छे काम करता है, लेकिन मैं clouser को __class__ संपत्ति को जोड़ना होगा अगर मैं एक clousure में एक निजी सदस्यों का उपयोग करने की जरूरत है !! और मुझे यह नहीं चाहिए!

फिर से धन्यवाद और मेरी बुरी अंग्रेजी के लिए खेद है, मैं देशी वक्ता नहीं हूं।

+0

आपको इस विचार को अनदेखा करना होगा कि जावास्क्रिप्ट में "कक्षा" जैसी कोई चीज़ है। नहीं है –

उत्तर

0

temp कॉलर है लेकिन इसमें __class__ संपत्ति नहीं है। आपने केवल test के लिए परिभाषित किया है।

+0

हां..निझे मैं यहां पूछ रहा हूं कि कोई दूसरा समाधान जानता है। –

+0

ps। मैं temp को __class__ संपत्ति भी जोड़ नहीं सकता। –

0

caller गैर-मानकीकृत और वास्तव में भंगुर है; सबसे अच्छा बचा है।

function globalFunc() 
{ 
    alert(this.__class__); 
    //Note globalFunc now has access to much more. 
} 

function MyObject(){ } 
MyObject.prototype.test=function(){ 
    globalFunc.call(this); 
} 
MyObject.prototype.__class__=MyObject; 

घटना के लिए एक बंद को जोड़ने के लिए -:

MyObject.prototype.test= function() { 
    element.addEventListener('click', function() { 
     globalFunc(MyObject); 
    }); 
}; 

या:

MyObject.prototype.test= function() { 
    var myclass= arguments.callee.__class__; 
    element.addEventListener('click', function() { 
     globalFunc(myclass); 
    }); 
}; 
2

आप परिदृश्य पूरी तरह स्पष्ट नहीं है, लेकिन यहाँ कुछ विकल्प हैं बहुत बेहतर मूल्य स्पष्ट रूप से पारित करने के लिए हैंडलिंग

MyObject.prototype.test = function(){ 
    var self = this; 
    var elem = //get some element; 
    //Not cross-browser but for illustration 
    elem.addEventListener('click', fnEvent); 
    function fnEvent() { globalFunc.call(self); } 
    elem = null 
} 
3

जावास्क्रिप्ट में कोई कक्षा नहीं है। इसके बजाए कई वस्तुएं एक ही कार्य के "स्वामित्व" कर सकती हैं।उदाहरण के लिए:

function myFun(){ 
    alert(this.name); 
} 

function Obj1(){ 
    this.name = "obj1"; 
} 
Obj1.prototype.fun = myFun; 

function Obj2(){ 
    this.name = "obj2"; 
} 
Obj2.prototype.fun = myFun; 
var obj1 = new Obj1(); 
var obj2 = new Obj2(); 
obj1.fun(); 
obj2.fun(); 
+2

ईएस 6 के बारे में क्या? – CoDEmanX

+0

@ कोडेमैनएक्स ES6 कक्षाएं सिंटैक्स चीनी हैं। कक्षा में एक विधि को परिभाषित करना कन्स्ट्रक्टर के प्रोटोटाइप पर विधि को सेट करने जैसा ही है – Marius

0

कार्य जावास्क्रिप्ट में "स्वामित्व" नहीं हैं। कार्य जावास्क्रिप्ट में प्रथम श्रेणी की वस्तुएं हैं, जिसका अर्थ है कि उन्हें किसी भी अन्य चर के समान पारित किया जा सकता है और कई वस्तुओं के गुणों के रूप में असाइन किया जा सकता है।

this एक समारोह शरीर के अंदर आप वस्तु जिस पर समारोह, कहा जाता था, तो एक तरीका है (जैसे myObj.myMethod()) के रूप में या समारोह के प्रोटोटाइप के call() या apply() पद्धति (उदा myFunc.call(myObj)) के माध्यम से कहा जाता है के लिए एक संदर्भ दे देंगे। अपने आप पर बुलाए गए फ़ंक्शन के अंदर (उदा। myFunc()), this आमतौर पर वैश्विक ऑब्जेक्ट होगा (अधिकांश ब्राउज़रों में window जैसा ही होगा)।

1

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

o.constructor आपको myObject फ़ंक्शन संदर्भ देगा।

लेकिन मेरी राय में, आप कार्यात्मक प्रोग्रामिंग जावास्क्रिप्ट

0

लघु जवाब का अधिकाधिक लाभ उठाने OO के बजाय एक कोशिश देना चाहिए, वहाँ वास्तव में आप क्या करने की कोशिश कर रहे हैं करने के लिए कोई रास्ता नहीं है। जावास्क्रिप्ट बस इस तरह काम नहीं करता है।

लांग जवाब ...

लगभग हर प्रोग्रामर मैं मिले हैं जो एक शास्त्रीय ऑब्जेक्ट मॉडल का उपयोग करता है तुम क्या कर रहे करने की कोशिश की है एक भाषा से जावास्क्रिप्ट आ गया है: शास्त्रीय OOP शैली वे कर रहे हैं का अनुकरण जावास्क्रिप्ट के साथ प्रयोग किया जाता है। यहां कोई शर्म की बात नहीं है, मैंने यह किया, यहां तक ​​कि प्रसिद्ध डगलस क्रॉकफोर्ड ने इसका प्रयोग किया, और फिर बाद में इसे दिया। मैंने भी किया। मुझे अभी भी लगता है कि यह वास्तव में लैंग्वेज

घुंघराले ब्रेसिज़ और परिचित दिखने वाले ऑपरेटरों द्वारा बेवकूफ़ बनें, इस सामान को आजमाने के लिए यह एक महत्वपूर्ण बात थी। इसके मूल में जावा के साथ बहुत कम आम है! जावास्क्रिप्ट एक कार्यात्मक लैंगेज है: कार्य अपने स्वयं के अधिकार में वस्तुएं हैं।

दो टूक: वहाँ तुम क्या करने कोशिश कर रहे हैं करने के लिए कोई तरीका है - निजी संपत्तियों के साथ वस्तुओं आप इस

के माध्यम से उपयोग कर सकते हैं कह रही है कि आसान :) समझना लागू करने का तरीका है कि और अधिक कठिन है है

कोई कक्षा नहीं है, केवल वस्तुएं हैं। ऑब्जेक्ट्स में केवल गुण हैं। वस्तुओं की गुणों में मूल्य हो सकते हैं। वे मान कार्य हो सकते हैं। यह फ़ंक्शन कहलाता है जब सेट किया जाता है, यह कुछ भी हो सकता है

क्लोजर जावास्क्रिप्ट में वास्तविक गोपनीयता प्राप्त करने का एकमात्र तरीका है। बाकी सब कुछ या तो कुछ संलग्न गुंजाइश में लीक हो जाता है, ओबफस्केटेड प्रॉपर्टी नामों पर निर्भर करता है, या कॉलर द्वारा किसी भी तरह से घुसपैठ किया जा सकता है, या आपकी ऑब्जेक्ट्स का संदर्भ देने के बाद भी स्मृति को रिसाव किया जा सकता है (क्योंकि आपके क्लीन-अप करने के लिए कोई विनाशक कार्य नहीं है में)। आप इसके बारे में कुछ क्यों नहीं कर सकते अधिक महत्वपूर्ण कारण है कि आप शायद shouldn ':

क्या आप कर रहे हैं अभी भी कोशिश करते हैं और ऐसा करने के लिए, यह प्रयास करके आप पता लगाना करके एक बेहतर जावास्क्रिप्ट प्रोग्रामर बन जाएगा एक अच्छी बात है टी

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