2017-04-25 79 views
0

如果我有一個構造函數,並且想要添加其他屬性,應該使用哪個屬性? constructorName.nameofProperty或constructorName.prototype.nameofProperty?有什麼不同?Javascript原型添加屬性的方法

+1

[將新屬性添加到沒有.prototype的構造函數中](http://stackoverflow.com/questions/9582341/adding-new-properties-to-constructor-function-without-prototype) – str

回答

0

如果您查看下面代碼片段的控制檯輸出結果,您會發現向對象原型中添加內容會將其添加到構造函數的所有實例中。 Jill和Tim現在都有setAge方法,但只有Jill實際上已經設定了她的年齡。另外,直接添加到構造函數的東西不會繼承到實例。

function Person(firstName, lastName) { 
 
    this.firstName = firstName; 
 
    this.lastName = lastName; 
 
} 
 

 
var Tim = new Person("Tim", "Dawson"); 
 
var Jill = new Person("Jill", "Swanson"); 
 

 
Person.prototype.setAge = function(age) { 
 
    this.age = age; 
 
} 
 

 
Jill.setAge(28); 
 

 
Person.doesThisInherit = function() { 
 
    console.log("No it doesn't"); 
 
} 
 

 
var Sam = new Person("Sam", "Testy"); 
 

 
console.log(Tim); 
 
console.log(Jill); 
 
console.log(Sam);

0

這要看情況。

你想從構造函數返回的對象具有這些屬性嗎?如果是這樣,你必須把這個資源增加,從構造函數返回的對象:

var constructorFunction = function() { 
    this.someProperty = someValue; 
} 

你想屬性添加到構造函數(記住函數是對象,因此您可以將屬性添加到他們)?如果是這樣,

constructorName.someProperty = someValue 

我不認爲這是你想要的。這不會影響從構造函數返回的對象。它只是爲該函數添加一個屬性。

如果需要,您可以將屬性附加到原型。這意味着用該函數構造的所有對象(如果使用'new'前綴調用它)將通過其原型鏈引用該屬性。這意味着每一個對象都沒有自己的屬性副本,但都會引用同一個對象。也就是說,附加到構造函數原型對象的那個。這可以節省你的記憶,如果這是一個問題。如果不是,那麼最好讓每個對象擁有該屬性的副本,這是第一個例子所做的。這樣,更改其中一個對象的屬性不會影響從相同構造函數創建的其他對象。