2010-11-06 110 views
6

可能重複:
Use of 'prototype' vs. 'this' in Javascript?兩種方式

我已經看到了這兩種方法的聲明在Javascript中的這兩種方式:

var User = function() { 
    this.name = 'Foo'; 
    this.greet = function() { 
     console.log('Hello!'); 
    } 
} 

var User = function() { 
    this.name = 'Foo'; 
} 

User.prototype.greet = function() { 
    console.log('Hello!'); 
} 

有什麼區別?

+1

@Archonix:不,它不是。 – kennytm 2010-11-06 20:12:01

+1

相關:http://stackoverflow.com/questions/1635116/javascript-class-method-vs-class-prototype-method – DaiYoukai 2010-11-06 20:26:51

回答

3

如果你正在創建一個'class',你想使用第二個。我用引號說類,因爲JavaScript沒有類的形式概念,因爲它使用原型繼承。

您在JS中創建的每個對象都從原型繼承其屬性。在第二個示例中,您創建的每個用戶都將從原型獲得方法「問候」。在第一個示例中,每個用戶都將從User構造函數獲取方法greet。

第二個優點是因爲第一種方法爲創建的每個對象都有效地創建了「問候」函數的新副本。在第二種方法中,每個用戶對象都有一個指向問候函數的指針,所以它實際上被解釋器重用。請注意,這與「問候」是靜態的不一樣。

0

你可能想看看this後爲「」正確的應用與「原型

1

在第一個例子中,你創建用戶的功能,那麼你的greet函數添加到實例(給User.greet())。但既然你在構造函數中有這個,那麼它將被添加到所有的實例中。

在第二個示例中,您可以定義User構造函數。然後,您可以定義所有用戶實例的問候原型。這和你在這裏的第一個例子是一樣的,但如果形成不同,變化就會變得更明顯

var User = function() { 
    this.name = 'Foo'; 
} 

var a=new User(); 
var b=new User(); 
a.greet=function(){ 
    alert(this.name); 
} 
/*a has the greet function, b does not*/ 

User.prototype.greet=function(){ 
    alert(this.name); 
} 
/*a and b both have the greet function now, since they are both of class User*/