2017-03-08 41 views
35

所以到現在爲止,我已經創建類和模塊在node.js方式如下:Node.js的ES6班,需要

var fs = require('fs'); 

var animalModule = (function() { 
    /** 
    * Constructor initialize object 
    * @constructor 
    */ 
    var Animal = function (name) { 
     this.name = name; 
    }; 

    Animal.prototype.print = function() { 
     console.log('Name is :'+ this.name); 
    }; 

    return { 
     Animal: Animal 
    } 
}()); 

module.exports = animalModule; 

與ES6

現在,您可以使「真正的」類就像這樣:

class Animal{ 

constructor(name){ 
    this.name = name ; 
} 

print(){ 
    console.log('Name is :'+ this.name); 
} 
} 

現在,首先,我喜歡這個:)但它引發了一個問題。你如何結合使用node.js的模塊結構?

假設你有一個類,你希望使用一個模塊用於演示的目的說你想使用fs

所以創建文件:


Animal.js

var fs = require('fs'); 
class Animal{ 

constructor(name){ 
    this.name = name ; 
} 

print(){ 
    console.log('Name is :'+ this.name); 
} 
} 

這是正確的方法嗎?

此外,如何將此類暴露給我的節點項目中的其他文件?如果你在一個單獨的文件中使用它,你仍然可以擴展這個類嗎?

我希望你們中的一些將能夠回答這些問題:)

+1

只要將ES6類的名稱與您以ES5方式處理構造函數名相同即可。他們是一樣的。 ES6語法只是語法糖,並創建完全相同的底層原型,構造函數和對象。 – jfriend00

+0

無論如何,創建「animalModule」的IIFE在具有自己的模塊範圍的節點模塊中是毫無意義的。 – Bergi

回答

42

是的,你的例子很好地工作。

至於暴露你的類,你可以export一類就像別的:

class Animal {...} 
module.exports = Animal; 

或者更短:

module.exports = class Animal { 

}; 

一旦導入到另一個模塊,那麼你可以把它當作如果它是在該文件中定義的:

var Animal = require('./Animal'); 

class Cat extends Animal { 
    ... 
} 
+4

你也可以做一些像module.exports = class Animal {} – Paul

+0

這是真的,我一直忘記你可以在賦值過程中命名。 – rossipedia

+0

它歸結爲代碼風格和清晰度。 'module.exports'通常用於匿名導出,而'export'用於命名導出。這是一個基本的編碼禮貌(你可能會說),可以幫助其他人知道如何導入你的課堂,模塊等等。 –

0

ES6的方式quire是import。您可以使用import { ClassName } from 'path/to/ClassName'語法將您的課程export導入其他地方。

import fs from 'fs'; 
export default class Animal { 

    constructor(name){ 
    this.name = name ; 
    } 

    print(){ 
    console.log('Name is :'+ this.name); 
    } 
} 

import Animal from 'path/to/Animal.js'; 
+0

這將是很好的澄清,這是一個選項,但不是一個要求。這是ES6模塊語法,但您仍然可以使用帶有Node常規CommonJS導出的ES6類。沒有要求您使用ES6導出語法的類。稱之爲「ES6方式」有點誤導。 – loganfsmyth

+0

的確如此,這是個人偏好。就個人而言,爲了語法的一致性,我會在'require'上使用'import'。 –

+0

是的,這是一個可靠的方法,我也是這樣做的,請記住,Babel的'import'與CommonJS模塊互操作的方式不可能最終在Node中工作,所以它可能需要在將來更改代碼以兼容沒有巴貝爾的節點。 – loganfsmyth

2

只要將ES6類名與您以ES5方式處理構造函數名相同即可。他們是一樣的。

ES6語法只是語法糖,並創建完全相同的底層原型,構造函數和對象。

所以,在你的ES6例如:

class Animal { 
    ... 
} 

var a = new Animal(); 

module.exports = {Animal: Animal}; 

你可以只把Animal喜歡你的對象的構造函數(一樣的,你會在ES5已完成)。你可以導出構造函數。您可以使用new Animal()來調用構造函數。使用它的一切都是一樣的。只有聲明語法是不同的。甚至還有一個Animal.prototype,它有你所有的方法。ES6的方式確實可以創造出相同的編碼結果,只是用更好的/更好的語法。