2015-04-16 16 views
6

Tôi hiểu rằng static phương pháp Class Methods, và đó là methodsInstance MethodsVirtuals rằng cũng như Instance Methods là nhưng họ không được lưu trữ trong cơ sở dữ liệu.Virtuals vs Methods in Mongoose

Tuy nhiên, tôi muốn biết nếu đó là sự khác biệt duy nhất giữa methodsvirtuals. Có cái gì khác mà tôi đang thiếu?

Trả lời

11

Không có phương pháp Ví ​​dụ, phương pháp tĩnh hoặc ảo nào được lưu trữ trong cơ sở dữ liệu. Sự khác biệt giữa các phương thức và các virtual là các virtual được truy cập như các thuộc tính và các phương thức được gọi là các hàm. Không có sự phân biệt giữa instance/static với virtual bởi vì nó không có ý nghĩa gì để có một thuộc tính tĩnh ảo có thể truy cập được trên lớp, nhưng nó có ý nghĩa để có một số phương thức static hoặc các phương thức factory trên lớp.

var PersonSchema = new Schema({ 
    name: { 
    first: String, 
    last: String 
    } 
}); 

PersonSchema.virtual('name.full').get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

var Person = mongoose.model('Person', PersonSchema); 

var person = new Person({ 
    name: { 
    first: 'Alex', 
    last: 'Ford' 
    } 
}); 

console.log(person.name.full); 

// would print "Alex Ford" to the console 

Trong khi phương pháp này được gọi là như chức năng bình thường.

PersonSchema.method('fullName', function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

var person = new Person({ 
    name: { 
    first: 'Alex', 
    last: 'Ford' 
    } 
}); 

console.log(person.fullName()); 

// notice this time you call fullName like a function 

Bạn cũng có thể "đặt" tài sản ảo như bạn đang sử dụng để có tính chất thường xuyên. Chỉ cần gọi .get.set để thiết lập chức năng cho cả hai hành động. Chú ý trong các .get bạn trả về một giá trị, trong khi trong các .set bạn chấp nhận một giá trị và sử dụng nó để đặt thuộc tính không ảo trên tài liệu của bạn.

PersonSchema 
    .virtual('name.full') 
    .get(function() { 
    return this.name.first + ' ' + this.name.last; 
    }) 
    .set(function (fullName) { 
    var parts = fullName.split(' '); 
    this.name.first = parts[0]; 
    this.name.last = parts[1]; 
    }); 

var person = new Person({ 
    name: { 
    first: 'Alex', 
    last: 'Ford' 
    } 
}); 

console.log(person.name.first); 

// would log out "Alex" 

person.name.full = 'Billy Bob'; 

// would set person.name.first and person.name.last appropriately 

console.log(person.name.first); 

// would log out "Billy" 

Bạn về mặt kỹ thuật có thể sử dụng phương pháp cho tất cả mọi thứ và không bao giờ sử dụng tài sản ảo, nhưng tài sản ảo là tao nhã cho những thứ nhất định như các ví dụ tôi đã đưa ra ở đây với person.name.full.