2010-12-08 9 views
17

"प्रोटोटाइप" के बजाय "इस" की संपत्ति के रूप में विधि "क्षेत्र" को परिभाषित करने के बीच क्या अंतर है?यह बनाम। प्रोटोटाइप

//console.clear() 

function Rectangle(w, h) 
{ 
    this.width = w; 
    this.height = h; 
    this.area = function() { return this.width * this.height; } 
} 


var r = new Rectangle(2, 3); 
var a = r.area(); 

//console.log(a) 

function Square(s) 
{ 
    this.side= s; 
} 

Square.prototype.area = function(){return this.side * this.side; } 

var r = new Square(2); 
var a = r.area(); 

//console.log(a) 

JavaScript - The definitive guide में Chapter 9 , part 1 की Prototypes and Inheritance अनुभाग में, लेखक का कहना है कि विधि "क्षेत्र" को परिभाषित करने प्रोटोटाइप ऑब्जेक्ट के अंदर फायदेमंद है, लेकिन उसकी व्याख्या वास्तव में समझ में आता नहीं था:

"। हर एक आयत वस्तु की व्याप्ति क्षेत्र हमेशा (किसी ज़ाहिर है, इसे बदल सकता है, लेकिन आप आमतौर पर एक वस्तु का तरीकों का इरादा निरंतर होने के लिए) एक ही समारोह को दर्शाता है। यह है उन विधियों के लिए नियमित गुणों का उपयोग करने के लिए अक्षम हैं, जो एक ही कक्षा के सभी ऑब्जेक्ट द्वारा साझा किए जाने का इरादा रखते हैं (यानी, ऑब्जेक्ट्स उसी कन्स्ट्रक्टर के साथ बनाए गए ऑब्जेक्ट्स)। "

मुझे पता है कि यह प्रश्न लगभग this एक जैसा दिखता है, लेकिन ऐसा नहीं है।

उत्तर

26

whatever = function() { ... } के साथ फ़ंक्शन को परिभाषित करने के लिए "बंद करें" कहलाता है, जहां फ़ंक्शन उस कार्य के स्थानीय चरों तक पहुंच सकता है जो इसे परिभाषित करता है। जब आप this.fn = function() { ... } कहते हैं, तो प्रत्येक ऑब्जेक्ट को फ़ंक्शन का एक उदाहरण मिलता है (और एक नया बंद)। इसका उपयोग अक्सर जावास्क्रिप्ट में "निजी" चर बनाने के लिए किया जाता है, लेकिन लागत के साथ आता है: प्रत्येक फ़ंक्शन (प्रत्येक ऑब्जेक्ट में) अलग होता है, और अधिक मेमोरी लेता है।

जब आप Rectangle.prototype.fn = function() { ... } कहते हैं, तो फ़ंक्शन का एक उदाहरण सभी Rectangle एस द्वारा साझा किया जाता है। यह स्मृति बचाता है, और ब्राउज़र में कुछ मेमोरी लीक को कम कर सकता है जो बुरी तरह से बंद हो जाता है। यदि आपको "निजी" सदस्यों की आवश्यकता नहीं है, या परिभाषित फ़ंक्शन के स्थानीय चर के लिए ऐसी अन्य पहुंच की आवश्यकता नहीं है, तो यह आमतौर पर एक बेहतर विचार है।

+3

तकनीकी रूप से बोलते हुए, फ़ंक्शन() {...} हमेशा बंद हो जाता है, भले ही इसे असाइन किया गया हो। बाकी सब कुछ अच्छा लग रहा है! – ide

+0

@ide: अच्छा बिंदु। संपादित। :) – cHao

+0

@ide: स्पष्टीकरण लोगों के लिए धन्यवाद! साथ ही, क्या आप मुझे बता सकते हैं कि मैं इसके बारे में और जान सकता हूं? – instantsetsuna

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