2011-07-10 18 views
0

我有一個看起來像這樣的文件:ExpressJS需要Javascript原型對象在另一個文件

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

我想知道如果你的問題是你的第一部分是一個函數,那麼你正在以一種我通常爲向對象添加函數的方式添加函數。你可能想要關注這個,看看它是否有幫助:http://mckoss.com/jscript/object.htm –

+1

你真的運行過代碼並試圖調用方法嗎?不要相信每一個輸出。 –

+0

@詹姆斯布萊克:這是正常的原型繼承。代碼實際上沒有錯。函數的原型實際上是一個對象。 –

回答

1

This link幫我弄明白了。

原來,這是Expressjs的問題。在使用其他文件時,您必須特別撥打export關於您想要使用的方法和對象require。或者,您可以撥打this.blahblah = function(){};而不是export。然後當你require一個文件,它會自動把它變成一個對象。

編輯
我找到了一個不同的解決方案。這就像改變我的require調用看起來像這樣簡單:var userController = new (require('./controllers/user').UserController);
之後,我可以使用原型函數和對象就好了,這使得文件更具可讀性和更容易理解。

0

是的,UserController是一個函數。它有屬性嗎?是的,它有兩個屬性,分別是lengthprototype。 JavaScript中的所有功能都有這兩個屬性。你爲什麼不看到這些屬性?因爲它們不是可枚舉的屬性。 JavaScript中的屬性可以有一個或多個屬性。在ES3中,它們是ReadOnly,DontEnum和DontDelete。在ES5中,它們是可配置的,可寫的,可枚舉的,獲取,設置和值。

在任一版本中,lengthprototype都不是可枚舉的,因此您的檢查員將不會向您顯示它們。

順便說一下,您所寫的所有「方法」都是對象UserController.prototype的屬性,而不是UserController

+0

謝謝你的答案,但我使用的Inspect代碼實際上需要原型生效,我相信(或者至少我知道它輸出了我對我的「Test()」對象的期望。 –

+0

你的檢查員也會說'Test '有兩個屬性還是零? –

相關問題