2016-01-27 46 views
1

可以說我有這個功能:添加屬性的功能,對象和原型

function myFunc() { 
    this.property1 = 10; 
} 
var myObject = new myFunc(); 

現在可以說,我想一個新的屬性添加到它。

myFunc.newProperty = "New"; 
myObject.newProperty = "New"; 
myFunc.prototype.newProperty = "New"; 

這些問題有什麼區別?我應該使用哪一個?

回答

3

方法1

myFunc.newProperty = "New"; 

因爲function本身就是一個對象,你只要在其上創建一個新的屬性。如果您直接使用函數對象可能會有用。

方法2

myObject.newProperty = "New"; 

myFunc構造的新實例,您創建自己的財產。當您需要修改單個實例,但不希望用newProperty修改類本身時很有用。
使用new myFunc()創建的任何新實例都不會繼承或包含newProperty

方法3

myFunc.prototype.newProperty = "New"; 

如果修改構造函數原型,則創建的對象將繼承這個屬性。當您需要使用new myFunc()創建的任何現有或新對象來繼承newProperty時很有用。

要使用哪一個取決於任務。通常使用點和。

+0

很好的答案。只是**方法3 **的一點 - 我從答案中推斷出*只有*新對象將繼承添加到構造函數原型的任何屬性,但實際上現有對象也將繼承屬性 - 它可能是我的誤解你的答案,但我只想指出這一點 –

+0

@JaromandaX偉大的提示。更新。 –

1

myFunct是構造函數(實際上JS中的每個函數都可以用作構造函數),當與new一起使用時,該函數會創建一個新的對象。

現在要添加新的屬性對象:

1)要添加新的屬性已經創建myObject的

myObject.newProperty = "New"; 

2)要新屬性添加到從myFunc

創建的每個對象
function myFunc() { 
    this.property1 = 10; 
    this.newProperty = "New"; 
} 

3)想要在已創建的所有對象中擁有新的屬性,從myFunc,它應該是父對象的屬性(這樣只有一個副本可用),對所有新創建的對象從myFunc

myFunc.prototype.newProperty = "New"; 
1

所以,當你正在做

myFunc.newProperty = "New"; 

此屬性是如此,即使你讓視爲myFunc的私有財產myFunc的某個實例,您將無法訪問。

同在

myObject.newProperty = "New"; 

的情況下,當你使它的處理myObject的的私有財產等等myObject的以外,你不能訪問它。

而當你在做

myFunc.prototype.newProperty = "New"; 

您可以從myFunc的所有實例訪問newProperty。

哪個好這是壞我不能說它的所有要求