2016-04-04 10 views
3

私はクラスのES 6構文を学んでいます。私はC#の背景から来たので、私の用語が正しくない場合はお詫び申し上げます。または、私が奇妙に見える何かをしている場合。ES 6 - クラスの使用

私は学習の練習としてWebアプリケーションを構築しています。これはNodeとExpressで構築されています。

'use strict'; 

module.exports = function() { 
    const app = this; 

    app.use('/blog', function(req, res) { 
     console.log('loading blog postings');   
     res.render('blog', {}); 
    }); 

    app.use('/', function(req, res) { 
     console.log('looking up: ' + req.path); 
     res.render('home', {}); 
    }); 
}; 

これらのビューの背後にいくつかのビューモデルを配置しようとしています。ですから、viewModelsというディレクトリがあります。

index.js 
blog.js 
home.js 

ファイルは現在、おそらく不正確に、次のようになります。:このディレクトリには、これらのファイルがある

index.jsを

'use strict'; 

module.exports = function() { 
    const HomeViewModel = require('./home); 
    const BlogViewModel = require('./blog); 
}; 

blog.js

export default class BlogViewModel { 
    constructor() { 
     this.title = 'My Blog'; 
    } 
} 

home.js

export default class HomeViewModel { 
    constructor() { 
     this.title = 'Home'; 
    } 
} 

私の考えは、私は私のパッケージまたは名前空間を定義するための方法としてindex.js使うということでした。その後、私のルーティングコードでは、私はこのような何かができる:

'use strict'; 

module.exports = function() { 
    const app = this; 
    const ViewModels = require('../viewModels/index'); 

    app.use('/blog', function(req, res) { 
     console.log('loading blog postings'); 
     let viewModel = new ViewModels.BlogViewModel(); 
     res.render('blog', viewModel); 
    }); 

    app.use('/', function(req, res) { 
     console.log('looking up: ' + req.path); 
     let viewModel = new ViewModels.HomeViewModel(); 
     res.render('home', viewModel); 
    }); 
}; 

をしかし、私はこれをしようとすると、私が言ういくつかのランタイムエラーを取得「エラー:モジュールが見つかりません 『を../viewModels/index』」 。これは私のモジュールを適切にセットアップしていないことを意味します。しかし、私は何が間違っているように見えますか?

+0

commonjsとES6モジュールを混在させないでください。 – Bergi

+0

@Bergi - 推奨アプローチは何ですか?私はこのことを学びたいと思っています。そこにはたくさんの例があります。良いアプローチ、貧弱なアプローチ、そして依存している別のフレームワークが使用しているアプローチのために単純に何が行われたのかを知るのは難しいです。 –

+0

あなたの 'index.js'には[この構文](http://stackoverflow.com/a/34072770/1048572)をお勧めします。 – Bergi

答えて

3

index.jsファイルが正しくありません。そこからViewModelsをエクスポートしません。このように変更します。

'use strict'; 

module.exports = { 
    HomeViewModel: require('./home'), 
    BlogViewModel: require('./blog') 
}; 

そして...のviewmodelsそれは、C#のためではなく、Node.js.のために良いことですノードでは、単なるモデル、IMOでなければなりません。

更新:https://nodejs.org/en/docs/es6/

のNode.jsは完全にすべてのES6の機能、特に新しいモジュールの宣言をサポートしていません。関数をエクスポートするには、標準のCommonJsモジュール宣言を使用する必要があります。

'use strict'; 

class HomeViewModel { 
    constructor() { 
    this.title = 'Home'; 
    } 
} 

module.exports = HomeViewModel; 
+0

それは問題ではありませんが、問題は彼が関数を呼び出すことはありませんでしたが、それはまた解決策 –

+0

でも彼は関数を呼び出すでしょう、彼のコードは動作しません。彼は関数の中でconstを定義していますが、その外には見えません。 – alexmac

+0

@AlexanderMacもし私がこのアプローチを使用すると、 'let viewModel = new ViewModels.HomeViewModel(); 'line throws'エラー:ルート:/ - ViewModels.HomeViewModelは関数ではありません。 ' –

0

実際に、私はあなたが何を求めているのかは分かりません。私が間違ったものに答えたら、決して気にしないでください。

まず、エラーError: Cannot find module '../viewModels/index'が表示されるのは、2つの点があるためです。ここから始めるのはちょうど1ドットの手段でなければなりません。しかし、これが問題なのかどうかはわかりません。 routing codeをどこに置くか尋ねたが、まだコメントする権限はありません。 (Ahhhh ....あなたが私に冗談を言っている...)

次に、ES6でクラスをエクスポートする適切な方法を示します。例えば

AClass.js

'use strict'; 
//This module can be used within the class. However, you cannot use it in another file. 
const AModule = require('AModule'); 
//The class name used here just for debug output. 
module.exports = class AClass { 
    constructor(startValue) { 
    //Not like C#. JavaScript does not define private or public. 
    this.value = startValue; 
    } 
    method(incValue) { 
    this.value += incValue; 
    AModule(); //Just show you can use this module within the class; 
    } 
} 

main.js

'use strict'; 
//You need to put a ./ before the path if you are include another module made by yourself. 
//You do not need it for a npm module. 
const AClass = require('./AClass.js'); 
//Now you just required the class of the AClass, you still need to new one; 
var aClass = new AClass(500); 
//After new one, you can call its method. 
aClass.method(30); 
//You can access its property by a dot; 
console.info(aClass.value); //530 

これはES6にクラスを作成するために、100%の作業方法です。ここで

は詳細なドキュメントです: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

とにかく、JavaScriptの中のクラスは単なる機能のようなもの、および機能のprototypeは、その方法になります。 new Class()はオブジェクトを作成するだけで、オブジェクトのクラスをthisClass.bind(obj, parameters)と同じ)として実行し、新しいオブジェクトのコンストラクタ・プロパティを使用する関数にリンクします。

module.exports = xxxは、xxxをこのモジュールの値にするだけです。たとえば、module.exports = 'Hello';console.info(require('module'));の場合、Helloを取得します。

関連する問題