Menurut manual Node.js:
Jika Anda ingin root dari ekspor modul Anda menjadi sebuah fungsi (seperti konstruktor) atau jika Anda ingin mengekspor objek lengkap dalam satu tugas alih-alih membangunnya satu properti pada satu waktu, tetapkan ke module.exports daripada ekspor .
Contoh yang diberikan adalah:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
dan digunakan seperti ini:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Pertanyaan saya: mengapa contoh tersebut tidak menggunakan persegi sebagai objek? Apakah hal berikut ini valid dan membuat contoh lebih "berorientasi objek"?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
javascript
node.js
commonjs
Naresh
sumber
sumber
square
untukSquare
yangnew square()
tidak ada lagi.Jawaban:
Modul CommonJS memungkinkan dua cara untuk menentukan properti yang diekspor. Dalam kedua kasus Anda mengembalikan Objek / Fungsi. Karena fungsi adalah warga kelas pertama dalam JavaScript, mereka dapat bertindak seperti Objek (secara teknis mereka adalah Objek). Oleh karena itu, pertanyaan Anda tentang penggunaan
new
kata kunci memiliki jawaban yang sederhana: Ya. Saya akan menggambarkan ...Ekspor modul
Anda dapat menggunakan
exports
variabel yang disediakan untuk melampirkan properti padanya. Setelah diperlukan dalam modul lain, properti yang ditetapkan tersebut menjadi tersedia. Atau Anda dapat menetapkan objek ke properti module.exports. Dalam kedua kasus, apa yang dikembalikan olehrequire()
adalah referensi ke nilaimodule.exports
.Contoh pseudo-code tentang bagaimana modul didefinisikan:
Pada contoh di atas
module.exports
danexports
merupakan objek yang sama. Bagian yang keren adalah Anda tidak melihat semua itu di modul CommonJS Anda karena seluruh sistem mengurusnya untuk Anda semua yang perlu Anda ketahui adalah ada objek modul dengan properti ekspor dan variabel ekspor yang menunjuk ke hal yang sama yang dilakukan module.exports.Wajibkan dengan konstruktor
Karena Anda dapat melampirkan fungsi secara langsung,
module.exports
Anda pada dasarnya dapat mengembalikan fungsi dan seperti fungsi lainnya, fungsi tersebut dapat dikelola sebagai konstruktor (Itu dicetak miring karena satu-satunya perbedaan antara fungsi dan konstruktor dalam JavaScript adalah cara Anda menggunakannya. Secara teknis tidak ada perbedaan.)Jadi berikut ini adalah kode yang sangat bagus dan saya pribadi mendorongnya:
Wajibkan untuk non-konstruktor
Hal yang sama berlaku untuk fungsi seperti non-konstruktor:
sumber
Menurut saya, beberapa contoh node.js cukup dibuat-buat.
Anda mungkin berharap melihat sesuatu yang lebih seperti ini di dunia nyata
Pemakaian
Untuk orang ES6
Menggunakannya di ES6
Saat menggunakan kelas, Anda harus menggunakan
new
kata kunci untuk membuat instatiate itu. Yang lainnya tetap sama.sumber
new
dan tidak menggunakannya. Tapi, apakah itu hanya karena Anda memiliki cek ituthis instanceof square
? Jika demikian, apa sebenarnya yang dilakukan mekanisme itu?import
danexport
didefinisikan? Ini adalah kata kunci yang dipesan di ECMAScript 6 (ES6). Sebelum ES6, seseorang harus menggunakan perpustakaan untuk mengelola modul. Modulasi node dimodelkan setelah Modul perpustakaan CommonJS. Apadefault
diexport default Square
? Ini menentukan apa yang akan diimpor ketika Anda hanya mengimpor 'file' dan bukan ekspor spesifik lainnya dari file itu. Selama mereka ada, saya menemukan halaman-halaman ini membantu: spring.io/understanding/javascript-modules dan exploringjs.com/es6/ch_modules.htmlPertanyaan ini sebenarnya tidak ada hubungannya dengan cara
require()
kerjanya. Pada dasarnya, apa pun yang Anda aturmodule.exports
dalam modul Anda akan dikembalikan darirequire()
panggilan untuk itu.Ini akan sama dengan:
Tidak perlu
new
kata kunci saat meneleponsquare
. Anda tidak mengembalikan instance fungsi itu sendirisquare
, Anda mengembalikan objek baru di akhir. Oleh karena itu, Anda cukup memanggil fungsi ini secara langsung.Untuk argumen yang lebih rumit
new
, lihat ini: Apakah kata kunci "baru" JavaScript dianggap berbahaya?sumber
new
agar orang lain dapat berpartisipasi dalam perang di sana.Kode contohnya adalah:
di main
menggunakan berikut ini mungkin berhasil
sumber
Pada akhirnya, Node adalah tentang Javascript. JS memiliki beberapa cara untuk menyelesaikan sesuatu, hal yang sama untuk mendapatkan "konstruktor", yang penting adalah mengembalikan suatu fungsi .
Dengan cara ini sebenarnya Anda membuat fungsi baru, seperti yang kami buat menggunakan JS di lingkungan Web Browser misalnya.
Secara pribadi saya lebih suka pendekatan prototipe, seperti yang disarankan Sukima di posting ini: Node.js - penggunaan module.exports sebagai konstruktor
sumber