2016-03-04 44 views
6

好吧,我是新來的貓鼬和試圖瞭解如何使用虛擬屬性。這是我一直在測試的示例代碼。在貓鼬虛擬,'這'是空的對象

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var objSchema = new Schema({ 
    created: {type: Number, default: Date.now()}, 
}); 

objSchema.virtual('hour').get(()=>{ 
    //console.log(this); 
    var d = new Date(this.created); 
    return d.getHours(); 
}); 

var obj = mongoose.model('obj', objSchema); 

var o = new obj(); 
o.toObject({virtuals: true}); 
console.log(o.created); 
console.log(o.hour); 

,所以我期待日誌是這樣的:

1457087841956 
2 

但輸出

1457087841956 
NaN 

,當我登錄「本」在虛擬吸氣的開始,它會打印{}。 我做錯了什麼?

回答

18

的問題是virtual函數使用的arrow function,同樣的問題在這裏可以ES6 anonymous function and schema methods發現,其原因是arrow function

Lexical this功能。要解決這個問題,請改變你的代碼如下

objSchema.virtual('hour').get(function(){ 
    console.log(this.created); 
    var d = new Date(this.created); 
    return d.getHours(); 
}); 
+2

謝謝,無法弄清楚我自己在一百萬年:) –