2016-04-10 21 views
0

私はNodeで練習しています。オブジェクトから継承する方法をundestandできません。 ルータから指定されたコントローラに電話したいと思います。コントローラはベースコントローラから継承されます。しかし、ベースコントローラーメソッドを呼び出そうとすると、私は常に定義されません。どのように継承し、親メソッドを正しく呼び出すか?Node.jsでの継承

私は初心者ですので、基本的なことが正しいとは限りません。

マイコード:

router.js:

module.exports = function(app) { 

    app.get('/', function(req, res) { 

    var MainController = require('app/controller/mainController'); 

    var controller = new MainController(req, res); 

    // Here I get undefined; 
    console.log(controller.getWidgets); 

    controller.index(); 

    }); 
} 

mainController.js:

var util = require('util'); 
var BaseController = require('./BaseController'); 

util.inherits(MainController, BaseController); 

function MainController(req,res) { 

    this.index = function() { 

    // Here I want to use method from parent (BaseController) 
    // to get page widgets, also get undefined. 
    var widgets = this.getWidgets(); 

    // console log also says there is no such method 
    console.log(this.getWidgets);   

    // then render page 
    res.render(...) 
    } 

} 

module.exports = MainController; 

BaseController.js:

function BaseController() { 

    // example code 
    this.getWidgets = function() { 
    console.log('widgets are sent'); 
    return 123; 
    } 

} 

module.exports = BaseController; 
+1

getWidgetsは、継承されたものではなく、独自のメソッドです。 – dandavis

+1

あなたの親コンストラクタへのスーパーコールを忘れました: 'MainController'の最初の行に' BaseController.call(this) 'を入れてください。 – Bergi

答えて

3

getWidgetsは、次のように定義されるべきですプロトタイプ法。

function BaseController() { 

} 

BaseController.prototype.getWidgets = function() { 
    console.log('widgets are sent'); 
    return 123; 
} 

module.exports = BaseController; 
+0

私は 'BaseController.prototype.getWidgets'と' this.getWidgets'は同じものだと思っていました。違いはなんですか?どこで私はそれについて読むことができますか? –

1

一般的にJavaScriptは、従来のOOP環境ではありません。

継承は「プロトタイプ」です。

意味は、オブジェクトが「親」と同じプロトタイプを共有するオブジェクトです「継承」あなたは追記でその記事prototypical inheritence

をお読みください、私は奇妙に感じることができますいくつかのプロトタイプの振る舞いに、具体的な例に小さな要旨を作っ最初にgist