2013-03-27 5 views
10

सरल जेएस विरासत को देखते हुए, इन दो उदाहरणों के बीच आधार कार्य में व्यावहारिक अंतर क्या है? दूसरे शब्दों में, जब किसी व्यक्ति को प्रोटोटाइप (या दूसरी तरफ) के बजाय "इस" पर फ़ंक्शन को परिभाषित करना चुनना चाहिए?इस.फंक्शन और प्रोटोटाइप.फंक्शन के बीच क्या अंतर है?

मेरे लिए दूसरा उदाहरण पचाने में आसान है, लेकिन इसके लिए और भी कितना है?

समारोह इस पर परिभाषित:

//base 
var _base = function() { 
    this.baseFunction = function() { 
     console.log("Hello from base function"); 
    } 
}; 
//inherit from base 
function _ctor() { 
    this.property1 = "my property value"; 
}; 
_ctor.prototype = new _base(); 
_ctor.prototype.constructor = _ctor; 
//get an instance 
var instance = new _ctor(); 
console.log(instance.baseFunction); 

समारोह प्रोटोटाइप पर परिभाषित: प्रोटोटाइप पर

//base 
var _base = function() {}; 
_base.prototype.baseFunction = function() { 
    console.log("Hello from base function"); 
} 
//inherit from base 
function _ctor() { 
    this.property1 = "my property value"; 
}; 
_ctor.prototype = new _base(); 
_ctor.prototype.constructor = _ctor; 
//get an instance 
var instance = new _ctor(); 
console.log(instance.baseFunction); 
+0

संभव डुप्लिकेट कन्स्ट्रक्टर?] (http://stackoverflow.com/questions/4508313/advantages-of-using-prototype-vs-defining-methods-straight-in-the-constructor) –

उत्तर

21

कार्य केवल एक बार बनाया है और प्रत्येक उदाहरण के बीच साझा कर रहे हैं। कन्स्ट्रक्टर में बनाए गए कार्यों को कन्स्ट्रक्टर के साथ बनाए गए प्रत्येक नए ऑब्जेक्ट के लिए नई ऑब्जेक्ट्स के रूप में बनाया जाता है।

एक सामान्य नियम फ़ंक्शन प्रोटोटाइप पर होना चाहिए क्योंकि उन्हें आम तौर पर उसी प्रकार की विभिन्न वस्तुओं के लिए संशोधित नहीं किया जाएगा, और इसमें थोड़ी मेमोरी/प्रदर्शन लाभ होता है। वस्तुओं और सरणी जैसे अन्य गुणों को कन्स्ट्रक्टर में परिभाषित किया जाना चाहिए, जब तक कि आप एक साझा, स्थैतिक संपत्ति नहीं बनाना चाहते हैं, इस मामले में आपको प्रोटोटाइप का उपयोग करना चाहिए।

इसका आसान सामान्य वस्तुओं या सरणियों के बजाय कार्यों

function Foo(){ 
    this.bar = []; 
} 
var fooObj1 = new Foo(); 
var fooObj2 = new Foo(); 

fooObj1.bar.push("x"); 
alert(fooObj2.bar) //[] 

साथ भेद को देखने के लिए के रूप में विरोध करने के लिए:

function Foo(){ 
} 

Foo.prototype.bar = [] 
var fooObj1 = new Foo(); 
var fooObj2 = new Foo(); 

fooObj1.bar.push("x"); 
alert(fooObj2.bar) //["x"] 
प्रोटोटाइप का उपयोग कर, बनाम में सीधे तरीकों को परिभाषित करने के लाभ की [
+0

आपके पहले दो अनुच्छेदों में महान सारांश - धन्यवाद! –

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