我有一个看起来像这样的文件:
function UserController(){};
UserController.prototype = {
theData: [],
findAll: function(callback) {
callback( null, this.theData );
},
findByID: function(id, callback) {
var result = null;
var count = theData.length;
for (var i = 0; i < count; i++) {
if (this.theData[i]._id == id) {
result = this.theData[i];
break;
}
}
callback(null, result);
},
findByName: function(name, callback) {
var result = null;
var count = theData.length;
for (var i = 0; i < count; i++) {
if (this.theData[i].name == name) {
result = this.theData[i];
break;
}
};
callback(null, result);
},
save: function(users, callback) {
var user = null;
if(typeof(users.length) === 'undefined') {
users = [users];
}
var count = users.length;
for (var i = 0; i < count; i++) {
user = users[i];
user._id = userCounter++;
user.created_at = new Date();
};
callback(null, users);
}
};
当我检查对象时(基于this),它告诉我它is function UserController(){}
并且没有方法或属性。
我从来没有在Javascript中使用原型设计,我看不出我在这里所做的事情有什么问题。应该注意的是,我在Node.js和Expressjs中使用它,但我不认为这会导致这个问题。
修改
为了简洁起见,我只发布了我目前正在使用的内容,但是使用这样的文件我也遇到了完全相同的问题:
var userCounter = 1;
function UserController(){};
UserController.prototype.theData = [];
UserController.prototype.findAll = function(callback) {
callback( null, this.theData );
};
UserController.prototype.findByID = function(id, callback) {
var result = null;
var count = theData.length;
for (var i = 0; i < count; i++) {
if (this.theData[i]._id == id)
{
result = this.theData[i];
break;
}
};
callback(null, result);
};
UserController.prototype.findByName = function(name, callback) {
var result = null;
var count = theData.length;
for (var i = 0; i < count; i++) {
if (this.theData[i].name == name) {
result = this.theData[i];
break;
}
};
callback(null, result);
};
UserController.prototype.save = function(users, callback) {
var user = null;
if(typeof(users.length) === 'undefined') {
users = [users];
}
var count = users.length;
for (var i = 0; i < count; i++) {
user = users[i];
user._id = userCounter++;
user.created_at = new Date();
};
callback(null, users);
};
再修改一次
如果我把它放在同一个文件中并检查它,我会得到我期望的结果:
function Test(){};
Test.prototype = {
theData: [],
hello: function(){
return "Hello World!";
}
};
我没有看到差异,我没有在UserController代码中看到错误。
答案 0 :(得分:1)
This link帮助我解决了问题。
原来这是Expressjs的一个问题。使用其他文件时,您必须专门针对要与export
一起使用的方法和对象调用require
。或者,您也可以拨打this.blahblah = function(){};
而不是export
。然后当你require
一个文件时,它会自动将它变成一个对象。
修改强>
我找到了另一种解决方案。这很简单,只需将require
调用更改为:var userController = new (require('./controllers/user').UserController);
之后,我可以使用Prototyped函数和对象,这使得文件更易读,更容易理解。
答案 1 :(得分:0)
是的,UserController
是一个功能。它有属性吗?是的,它有两个属性,即length
和prototype
。 JavaScript中的所有函数都具有这两个属性。你为什么不看这些属性?因为它们不是可枚举的属性。 JavaScript中的属性可以具有一个或多个属性。在ES3中,它们是ReadOnly,DontEnum和DontDelete。在ES5中,它们是可配置的,可写的,可枚举的,获取的,设置的和值的。
在任一版本中,length
和prototype
都不可枚举,因此您的检查员不会向您展示。
顺便提一句,您编写的所有“方法”都是对象UserController.prototype
的属性,而不是UserController
。