2012-12-23 79 views
0

我有點困惑關於正在發生的事情與我的代碼,這裏是我到目前爲止有:對象原型方法與重視

function Person(name) { 
    this.name = name; 
} 

Person.prototype.getName = this.name; 
Person.prototype.displayName = function() { 
    return this.name; 
} 


var Sethen = new Person("Sethen"); 

console.log(Sethen.getName); 
console.log(Sethen.displayName()); 

我很好奇,爲什麼getName不給我this.name值,而只記錄的空白,而displayName方法給我正確的值。 getName是我原型對象的一個​​屬性,所以我的思考過程是我可以像這樣抓住它。

爲什麼getName無法登錄的Sethen價值?我會如何去抓住像普通財產那樣的信息?我必須使用一種方法嗎?

+0

如果你打算downvote給出一個理由。建設性地爲這個社區做出貢獻。 – Sethen

回答

5

因爲this值是不是你想運行的代碼時,它是。 this大概等於全局對象(即window)。

既然你打電話displayName並通過與Person對象的實例前綴它設置的背景下,this是函數的內部設置正確,你會得到這個人的名字了。

當然,你總是可以直接訪問的name屬性(Sethen.name)。

+0

我會如何去抓住像普通財產那樣的信息?我必須使用一種方法嗎? – Sethen

+1

我相信是的,除非你在'Person'構造函數中定義了屬性。 –

+1

你不能直接調用Sethen.name嗎? – spike

2

問題是getName不是函數,而是在Person對象被構造之前首先分配Person.prototype.getName時賦值的屬性。所以,它不可能包含任何特定Person對象的值。

你根本無法在當時訪問對象的實例數據所創建的原型,因爲沒有Person對象還不存在,因此不存在實例數據還沒有,因此this不指向Person對象。

相反,Person.prototype.getName = this.name;被分配prototype對象的this.name一個值,其在您的代碼是window.name或在嚴格模式下會導致錯誤,因爲this是不確定的。

原型可分配的功能或代碼初始化期間已存在的任何數據。分配給原型的東西對於您創建的那種類型的所有對象都具有相同的值。這就是爲什麼給它們分配函數/方法最有用的原因。

您可以實現這種方式來獲得一個給定的Person對象的值:

function Person(name) { 
    this.name = name; 
} 

Person.prototype.getName() = function() { 
    return this.name; 
} 

var Sethen = new Person("Sethen"); 

console.log(Sethen.getName()); 

另一種選擇是隻訪問直接.name屬性:

function Person(name) { 
    this.name = name; 
} 
var Sethen = new Person("Sethen"); 
console.log(Sethen.name); 
+0

或者你可以直接調用'Sethen.name'而不將它綁定到方法。這就是我一直在尋找的。 – Sethen

+0

@SethenMaleno - 是的,我也在努力,現在已經加入了我的答案。 – jfriend00