2016-04-04 2 views
3

Я изучаю синтаксис классов ES 6 классов. Я исхожу из фона C#, поэтому прошу прощения, если моя терминология неверна. Или, если я делаю то, что выглядит странно.ES 6 - Использование классов

Я создаю веб-приложение в качестве учебного упражнения. Он построен на узле и 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 за этими видами. Итак, у меня есть каталог под названием 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

Я бы рекомендовал [этот синтаксис] (http://stackoverflow.com/a/34072770/1048572) для вашего 'index.js'. – Bergi

ответ

3

Ваш файл index.js неверен, вы не экспортируете ViewModels оттуда. Измените его так:

'use strict'; 

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

И ... viewModels это хорошо для C#, но не для Node.js. В узле это должны быть только модели, ИМО.

Update:

Node.js не полностью поддерживает все функции ES6, особенно новые модули декларации: https://nodejs.org/en/docs/es6/. Вы должны использовать стандартную декларацию CommonJS модуля экспортировать функцию:

'use strict'; 

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

module.exports = HomeViewModel; 
+0

Это не имеет значения, проблема в том, что он не вызывал функцию, но это также решение –

+0

, даже он будет вызывать функцию, его код не будет работать. Он определяет consts в функции, невидимой вне ее. – alexmac

+0

@AlexanderMac Когда я использую этот подход, пусть 'let viewModel = new ViewModels.HomeViewModel(); Ошибка 'line throws': Маршрут:/- ViewModels.HomeViewModel не является функцией' –

0

На самом деле, я не совсем уверен, что вы хотите спросить. Если бы я ответил на неправильные вещи, просто неважно.

Во-первых, причина, по которой вы получаете ошибку Error: Cannot find module '../viewModels/index', состоит в том, что вы положили туда две точки. Здесь должна быть только одна точка. Однако я не уверен, что это проблема. Я хотел спросить, где вы положили routing code, но у меня нет разрешения на комментарий. (Ahhhh .... Stack overflow вы шутите меня ...)

Во-вторых, вот правильный способ экспорта класса в 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 

Это 100% работа способ создать класс в ES6.

Здесь собрана подробная документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

В любом случае, занятия в JavaScripts только как функции, а функция-х prototype будет его методы. new Class() просто создает объект, запускает функцию класса с объектом как this (То же, что и Class.bind(obj, parameters)), а затем связывает свойство конструктора нового объекта с используемой функцией.

module.exports = xxx просто делает xxx значение этого модуля. Например, если вы module.exports = 'Hello'; и console.info(require('module'));, вы получите Hello.

Смежные вопросы