मान लीजिए मैं एक Foo
वस्तु हैJavascript जोड़ विधि आपत्ति उठाने
कैसे मैं एक bar()
विधि जोड़कर इस वस्तु का विस्तार कर सकते हैं और यह भी सुनिश्चित Foo
की कि भावी अवसरों के इस विधि है?
मान लीजिए मैं एक Foo
वस्तु हैJavascript जोड़ विधि आपत्ति उठाने
कैसे मैं एक bar()
विधि जोड़कर इस वस्तु का विस्तार कर सकते हैं और यह भी सुनिश्चित Foo
की कि भावी अवसरों के इस विधि है?
आप कम महत्वपूर्ण चीज़ों के प्रोटोटाइप में जोड़ने के लिए की जरूरत है: मोज़िला यहाँ एक अच्छा परिचय है
function Foo(){}
Foo.prototype.bar = function(){}
var x = new Foo()
x.bar()
जावास्क्रिप्ट में इस तरह पुनः उपयोग करने योग्य वस्तुओं को बनाने के कई तरीके हैं।
निम्नलिखित अपने उदाहरण में काम करेंगे:
function Foo(){
this.bar = function(){
alert("Hello World!");
}
}
myFoo = new Foo();
myFoo.bar(); // Hello World
आप इसे एक विधि बनाने के लिए एक फ़ंक्शन बना सकते हैं।
Foo.bar = function(passvariable){ };
एक संपत्ति यह सिर्फ एक स्ट्रिंग, डेटा प्रकार या बूलियन
Foo.bar = "a place";
यह सब निर्दिष्ट किया जाएगा के रूप में आप कैसे Foo
बना रहे हैं पर निर्भर करता है, और आप .bar()
का कैसे उपयोग करने।
सबसे पहले, क्या आप अपनी ऑब्जेक्ट के लिए एक कन्स्ट्रक्टर-फ़ंक्शन का उपयोग कर रहे हैं?
var myFoo = new Foo();
यदि हां, तो आप Foo
समारोह के prototype
संपत्ति .bar
साथ है, इसलिए की तरह का विस्तार कर सकते हैं: इस फैशन में
function Foo() { /*...*/ }
Foo.prototype.bar = function() { /*...*/ };
var myFoo = new Foo();
myFoo.bar();
, Foo
के प्रत्येक उदाहरण अब वही की पहुंच है .bar
का उदाहरण।
बुद्धि के लिए: .bar
this
के लिए पूरा उपयोग करना होगा, लेकिन बिल्कुल नहीं पहुँच निर्माता समारोह के भीतर 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 लाइनों लंबे (या अधिक) हो सकता है।