2012-12-06 55 views
2

我已經JS對象是這樣的:JavaScript在方法中使用構造函數參數,哪種方式有效?

var Dog = function(dogName) { 
    this.bark = function() { 
    console.log(dogName + " is barking"); 
    } 
} 

var Dog = function(dogName) { 
    this.dogName = dogName; 
    this.bark = function() { 
    console.log(this.dogName + " is barking"); 
    } 
} 

我可以同時使用相同的方式:

var puppy = new Dog("Ringo"); 
puppy.bark(); 

我的問題是有沒有這兩個之間的任何實際的區別方法?給this.<field>指定構造函數參數會更好嗎?或者我可以直接使用這些參數,因爲它們可以被內部函數訪問?兩者是否有特殊情況?

回答

2

的區別是什麼情況,當你說

var puppy = new Dog("Ringo"); 
puppy.dogName = "George"; 
puppy.bark(); 

用第一種方法,它仍然會使用的名稱「環」,並用第二種方法,它會說「喬治」。出於同樣的原因,如果你試圖說

var puppy = new Dog("Ringo"); 
console.log("created new puppy: " + puppy.dogName); 

這將與第二個版本,但不是第一個工作。因此,如果您的目標是使dogName有效保密,以便在初始化後無法訪問或更改,則應該採用第一種方法,否則應始終採用第二種方法。

4

最大的區別是參數dogName的功能範圍爲您聲明的內聯函數 - 它在功能上是私有的。另外,如果您通過實例更改值(如puppy),它不會更改函數輸出。

例如,如果我這樣做:

Dog.prototype.bark2 = function() { console.log(dogName); }

這將失敗,因爲它超出了範圍。但將其添加到this給我訪問,所以我可以做console.log(this.dogName)。所以再次,這是關於範圍和你想如何使用它。

0

在第一個版本中,dogName是私有的 - 沒有辦法檢查該對象並找到該變量的值。你可以通過調用bark推斷它,但你不能直接看到它;只有在function表達式中聲明的代碼才能看到它。

在第二個版本中,dogName公開可見爲object.dogName

+0

所以它看起來是封裝事物的好方法。 – grafthez

相關問題