2013-03-27 19 views
10

Basit JS devralması verildiğinde, bu iki örnek arasındaki temel işlevdeki pratik fark nedir? Başka bir deyişle, bir kişi ne zaman prototip (veya başka bir şekilde) yerine "bu" üzerinde bir işlev tanımlamayı seçmelidir?Bu.function ve prototype.function arasındaki fark nedir?

Benim için ikinci örnek sindirimi daha kolay, ancak bunun için ne kadar var? Bu konuda tanımlanan

fonksiyonu: prototip üzerinde tanımlı

//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); 

fonksiyonu: prototip üzerinde

//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

olası yinelenen kurucu?] (http://stackoverflow.com/questions/4508313/advantages-of-using-prototype-vs-defining-methods-straight-in-the-constructor) –

cevap

21

Fonksiyonlar sadece bir kez oluşturulur ve her bir örneği arasında paylaşılır. Kurucuda oluşturulan işlevler, kurucuyla oluşturulan her yeni nesne için yeni nesneler olarak oluşturulur. Genel kural olarak, genel olarak aynı tipteki farklı nesneler için değiştirilmeyecekleri için prototip üzerinde olmalıdır ve bu durum hafızada küçük bir hafıza/performans avantajına sahiptir. Nesneler ve diziler gibi diğer özellikler, paylaşılan bir statik özellik oluşturmak istemediğiniz sürece yapıcıda tanımlanmalıdır; bu durumda, prototipi kullanmalısınız. aksine

Onun daha kolay, normal nesneler veya diziler yerine fonksiyonların

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

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

ile ayrımları görmek için:

function Foo(){ 
} 

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

fooObj1.bar.push("x"); 
alert(fooObj2.bar) //["x"] 
prototipi kullanarak, vs düz yöntemleri tanımlayan Avantajları [ait
+0

İlk iki paragrafınızda büyük bir özet - teşekkürler! –