2016-01-21 65 views
2

我遇到了在javascript中向對象添加方法的問題。以下代碼應返回一個數字,但返回NaN。希望你能幫助將方法添加到對象

function people(name, age){ 
    this.name = name; 
    this.age = age; 
    this.numYearsLeft = pension(); 
} 

function pension(){ 
    numYears = 65 - this.age; 
    return numYears; 
} 

var andrews = new people("Andrews Green", 28); 

console.log(andrews.numYearsLeft); 
+0

因爲養老金無關的人。 'console.log(this)' – epascarello

+2

'this'是引用當前上下文的關鍵字。在你的'pension'函數中,'this.age === window.age',_not_'people.age'。 – jperezov

+0

注意 - 約定會讓你將'people'函數定義爲'Person'。以大寫字母開頭的函數名稱表示它們是構造函數(您可以使用'new'關鍵字調用以創建構造函數的新實例的函數)。創建一個新的「人」也比創建一個新的「人」更具語法意義。 –

回答

5

你可以使用一個原型模式 - 使pension一個方法people

function people(name, age){ 
    this.name = name; 
    this.age = age; 
    this.numYearsLeft = this.pension(); // note the `this` 
} 

people.prototype.pension = function(){ // note the `prototype` 
    var numYears = 65 - this.age; 
    return numYears; 
}; 

var andrews = new people("Andrews Green", 28); 

console.log(andrews.numYearsLeft);  // 37 

使用prototypepension方法將繼承構造函數(people)性能(允許您參考使用this關鍵字)。
這樣做的另一個好處是,每new實例化people您不會重新創建pension方法的新實例/回憶。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

+0

嗨。非常感謝。我不知道「原型」;謝謝! – Drew

2

的JavaScript所以總之你在錯誤的範圍是在一個「功能範圍」的作品,。您需要綁定「this」變量或使用prototype屬性在people類上創建一個函數。

您可以將它定義爲原型函數,而不是

people.prototype.pension = function() { 
    numYears = 65 - this.age; 
    return numYears; 
} 
0

爲了叫你需要把一個函數()。 console.log(andrews.numYearsLeft);console.log(andrews.numYearsLeft());

同樣在

function pension(){ 
numYears = 65 - this.age; 
return numYears; 
} 

this.age未定義,因此爲NaN。

(編者)也許嘗試:

function people(name, age){ 
    var that = this; 
    this.name = name; 
    this.age = age; 
    this.numYearsLeft = function(){ 
     numYears = 65 - that.age; 
     return numYears; 
    }; 
} 
var andrews = new people("Andrews Green", 28); 
console.log(andrews.numYearsLeft()); 
+1

調用'andrews.numYearsLeft()'會拋出一個錯誤,因爲'numYearsLeft'不是函數,而是對調用'pension()'的結果的引用。 –

+0

正確。將基於此編輯。 –

2

如果添加的console.log()線養老金裏面,你會看到this是窗口,而不是人反對。一種改變this的方法是使用call()。

this.numYearsLeft = pension.call(this); 

例子:

function people(name, age) { 
 
    this.name = name; 
 
    this.age = age; 
 
    this.numYearsLeft = pension.call(this); 
 

 
} 
 

 
function pension() { 
 
    numYears = 65 - this.age; 
 
    return numYears; 
 
} 
 

 
var andrews = new people("Andrews Green", 28); 
 

 
console.log(andrews.numYearsLeft);

其他選項是使人民原型的一部分。

function people(name, age) { 
 
    this.name = name; 
 
    this.age = age; 
 
    this.numYearsLeft = this.pension(); 
 

 
} 
 

 
people.prototype.pension = function() { 
 
    numYears = 65 - this.age; 
 
    return numYears; 
 
} 
 

 
var andrews = new people("Andrews Green", 28); 
 

 
console.log(andrews.numYearsLeft);