2016-01-23 66 views
-1

比方說,我有這樣的構造:爲什麼像這樣向JavaScript引用類型添加方法不起作用?

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

我想方法添加到它。

爲什麼這樣的:

Person.prototype.getFullName = function() { 
    return this.firstName + " " + this.lastName; 
}; 

就是要做到這一點,而不是這樣的:我不知道爲什麼我收到downvoted

Person.getFullName = function() { 
    return this.firstName + " " + this.lastName; 
}; 

,所以如果downvoters會增加我將不勝感激評論與downvote的實際原因。這將幫助我更好地說出我未來的問題。

我在某種程度上理解了原型背後的繼承概念。至少在初級水平的教程,文章和書籍中顯示的範圍內。

讓我感到困惑的可能是我在Java和類中的背景,這在JavaScript中不是一回事。

我想象,這個定義一個類Person

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

當我使用類創建一個對象:

var myObject = new Person("John", "Doe"); 

我仍然可以添加一些新的屬性或方法到該對象:

myObject.getFullName = function() { 
    return this.firstName + " " + this.lastName; 
}; 

現在只有myObject會有這個新的方法getFullName,很清楚。

var myObject2 = new Person("Daniel", "Cook"); 

對於myObject2沒有getFullName方法,依然清晰。

一旦我添加了一個方法,我的「類」的原型Person將通過與「類」創建的所有對象繼承:

Person.prototype.getFullName = function() { 
    return this.firstName + " " + this.lastName; 
}; 

現在甚至myObject2,有getFullName方法。明確。

好的。我認爲我在腦海中解決了這個問題的根源。擴展這篇文章幫助了我。

函數Person也是一個對象,對不對?

+0

我想看看一些討論它的原型繼承系統的JS教程。 –

+0

@DaveNewton我做過了,但是這還不清楚,這就是爲什麼我問。在Java中有一些經驗我想象添加一個方法到「類」Person.getfullName會很好。在任何示例中,我都沒有看到它,並且它不會拋出任何錯誤,因此它會執行某些操作。問題是什麼,它是否有用。 –

+1

我認爲閱讀我的回答這個問題將幫助你(這不是一個重複,只是相關)http://stackoverflow.com/questions/31630409/what-is-the-point-of-javascript-constructor/31630682#31630682 – LukeP

回答

0

myObject.methodName = function() {};增加了一個名爲methodName的方法來反對myObject。這意味着您可以直接從myObject調用它,並且不需要創建實例。

簡單地說,你只是這樣稱呼它:

myObject.methodName(); 

myObject.prototype.methodName = function() {};添加一個名爲methodName到對象myObject的原型方法。這意味着它存在於每個myObject的實例中,但不能直接從myObject調用它。

你可以通過這樣稱呼它:

var someInstance = new myObject(); 
someInstance.methodName(); 

在這種情況下,myObject.methodName();會產生一個錯誤!


這兩種都是在JavaScript上實現object的有效方法。他們背後只是一個不同的概念。

要深入瞭解這兩種方法之間的差異,我建議你看看我的文章The many ways to implement OOP in Javascript

+0

當談到添加方法來對象本身,或它的原型 - 我明白它。但是在上面的代碼中,我已經爲「類」Person添加了一個方法,而不是實際的對象。當一個方法被添加到類中時,沒有實例化的對象,這讓我感到困惑。 –

+0

我讀過你的文章後就會回來。謝謝你的鏈接。 –

+1

@so_user:在最近添加類EcmaScript之前,JavaScript中沒有任何類。只有功能和對象。無論如何,沒有啓動的對象(你稱之爲「類」)的行爲或多或少像Java中的單例類。 –

相關問題