2012-11-23 17 views
48

मान लीजिए मैं एक Foo वस्तु हैJavascript जोड़ विधि आपत्ति उठाने

कैसे मैं एक bar() विधि जोड़कर इस वस्तु का विस्तार कर सकते हैं और यह भी सुनिश्चित Foo की कि भावी अवसरों के इस विधि है?

उत्तर

42

आप कम महत्वपूर्ण चीज़ों के प्रोटोटाइप में जोड़ने के लिए की जरूरत है: मोज़िला यहाँ एक अच्छा परिचय है

function Foo(){} 
Foo.prototype.bar = function(){} 
var x = new Foo() 
x.bar() 
10

जावास्क्रिप्ट में इस तरह पुनः उपयोग करने योग्य वस्तुओं को बनाने के कई तरीके हैं।

निम्नलिखित अपने उदाहरण में काम करेंगे:

function Foo(){ 
    this.bar = function(){ 
     alert("Hello World!"); 
    } 
} 

myFoo = new Foo(); 
myFoo.bar(); // Hello World​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 
5

आप इसे एक विधि बनाने के लिए एक फ़ंक्शन बना सकते हैं।

Foo.bar = function(passvariable){ }; 

एक संपत्ति यह सिर्फ एक स्ट्रिंग, डेटा प्रकार या बूलियन

Foo.bar = "a place"; 
39

यह सब निर्दिष्ट किया जाएगा के रूप में आप कैसे Foo बना रहे हैं पर निर्भर करता है, और आप .bar() का कैसे उपयोग करने।

सबसे पहले, क्या आप अपनी ऑब्जेक्ट के लिए एक कन्स्ट्रक्टर-फ़ंक्शन का उपयोग कर रहे हैं?

var myFoo = new Foo(); 

यदि हां, तो आप Foo समारोह के prototype संपत्ति .bar साथ है, इसलिए की तरह का विस्तार कर सकते हैं: इस फैशन में

function Foo() { /*...*/ } 
Foo.prototype.bar = function() { /*...*/ }; 

var myFoo = new Foo(); 
myFoo.bar(); 

, Foo के प्रत्येक उदाहरण अब वही की पहुंच है .bar का उदाहरण।
बुद्धि के लिए: .barthis के लिए पूरा उपयोग करना होगा, लेकिन बिल्कुल नहीं पहुँच निर्माता समारोह के भीतर variables करना होगा:

function Foo() { var secret = 38; this.name = "Bob"; } 
Foo.prototype.bar = function() { console.log(secret); }; 
Foo.prototype.otherFunc = function() { console.log(this.name); }; 

var myFoo = new Foo(); 
myFoo.otherFunc(); // "Bob"; 
myFoo.bar(); // error -- `secret` is undefined... 
      // ...or a value of `secret` in a higher/global scope 

एक और तरीका है, आप किसी भी वस्तु वापस जाने के लिए एक समारोह निर्धारित कर सकते हैं (नहीं this), .bar साथ उस वस्तु की एक संपत्ति के रूप में बनाया:

function giveMeObj() { 
    var private = 42, 
     privateBar = function() { console.log(private); }, 
     public_interface = { 
      bar : privateBar 
     }; 

    return public_interface; 
} 

var myObj = giveMeObj(); 
myObj.bar(); // 42 

इस फैशन में, आपके पास एक ऐसा कार्य है जो नई वस्तुओं को बनाता है।
उन वस्तुओं में से प्रत्येक के लिए .bar फ़ंक्शन बनाया गया है।
प्रत्येक .bar समारोह का उपयोग समारोह है कि उनके विशेष वस्तु लौटे भीतर "निजी" चर, क्या बंद कहा जाता है के माध्यम से, है।
प्रत्येक .bar अभी भी this के लिए उपयोग this, साथ ही है, जब आप कॉल myObj.bar(); की तरह समारोह हमेशा (मेरे उदाहरण Foo में, public_interface) myObj के पास भेजेगा।

इस प्रारूप का नकारात्मक पक्ष यह है कि यदि आप इनमें से लाखों वस्तुओं को बनाने जा रहे हैं, तो यह .bar की लाखों प्रतियां भी है, जो स्मृति में खाएंगी।

आप इसे कन्स्ट्रक्टर फ़ंक्शन के अंदर भी कर सकते हैं, कन्स्ट्रक्टर के अंदर this.bar = function() {}; सेट कर सकते हैं - फिर से, कन्स्ट्रक्टर में निजी चर के लिए बंद हो जाएगा और डाउनसाइड मेमोरी आवश्यकताएं बढ़ा दी जाएगी।

तो पहला सवाल यह है:
आप अपने तरीकों "निजी" डेटा है, जो (this या myObj.X के माध्यम से) वस्तु ही के माध्यम से पहुँचा नहीं जा सकता पढ़ने/संशोधित करने के लिए उपयोग किया है करने की उम्मीद करते हैं?

और दूसरा प्रश्न यह है: क्या आप इन वस्तुओं में से पर्याप्त बना रहे हैं ताकि स्मृति उन्हें एक बड़ी चिंता होगी, यदि आप उन्हें अपना व्यक्तिगत कार्य देते हैं, तो उन्हें साझा करने के बजाए?

उदाहरण के लिए, यदि आप हर त्रिकोण और हर बनावट एक उच्च अंत 3 डी खेल में अपने स्वयं के .draw समारोह दिया था, कि overkill हो सकता है, और यह संभावना है इस तरह के एक नाजुक प्रणाली में फ़्रेमरेट को प्रभावित करती है ...

अगर, हालांकि, आप प्रति पृष्ठ 5 स्क्रॉलबार बनाने के लिए देख रहे हैं, और आप हर एक अगर की यह बताने के हर दूसरे आवेदन उन्हीं चीजों को सेट पढ़ने के लिए/उपयोग कर सकते है बिना, घसीटा जा रहा है में अपनी स्थिति की स्थापना की और ट्रैक रखने के लिए सक्षम होना चाहते हैं , तो वहाँ वास्तव में डर लगता है कि 5 अतिरिक्त कार्यों अपने अनुप्रयोग को मारने के लिए जा रहे हैं होने के लिए कोई कारण नहीं है, यह सोचते हैं कि यह पहले से ही 10,000 लाइनों लंबे (या अधिक) हो सकता है।

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