10 konsep JavaScript yang harus dikuasai oleh setiap pengembang Node.js

Rahul Mhatre adalah pemimpin tim pengembang di Software AG.

Dengan JavaScript dan mesin V8 sebagai intinya, arsitektur yang digerakkan oleh peristiwa, dan skalabilitas di luar kotak, Node.js dengan cepat menjadi standar de facto untuk membuat aplikasi web dan produk SaaS. Kerangka kerja Node.js seperti Express, Sails, dan Socket.IO memungkinkan pengguna untuk dengan cepat melakukan bootstrap aplikasi dan hanya fokus pada logika bisnis.

Node.js berhutang banyak pada JavaScript karena popularitasnya yang luar biasa. JavaScript adalah bahasa multiparadigma yang mendukung berbagai gaya pemrograman, termasuk pemrograman fungsional, pemrograman prosedural, dan pemrograman berorientasi objek. Ini memungkinkan pengembang menjadi fleksibel dan memanfaatkan berbagai gaya pemrograman.

Tapi JavaScript bisa menjadi pedang bermata dua. Sifat multiparadigma JavaScript berarti bahwa hampir semuanya bisa berubah. Dengan demikian, Anda tidak dapat mengesampingkan kemungkinan mutasi objek dan cakupan saat menulis kode Node.js. Karena JavaScript tidak memiliki pengoptimalan panggilan ekor (yang memungkinkan fungsi rekursif menggunakan kembali tumpukan frame untuk panggilan rekursif), berbahaya menggunakan rekursi untuk iterasi besar. Selain perangkap seperti ini, Node.js adalah single threaded, jadi sangat penting bagi developer untuk menulis kode asynchronous.

JavaScript bisa menjadi keuntungan jika digunakan dengan hati-hati — atau menjadi kutukan jika Anda sembrono. Mengikuti aturan terstruktur, pola desain, konsep kunci, dan aturan dasar akan membantu Anda memilih pendekatan yang optimal untuk suatu masalah. Konsep kunci apa yang harus dipahami oleh programmer Node.js? Di bawah ini saya akan membagikan 10 konsep JavaScript yang menurut saya paling penting untuk menulis kode Node.js yang efisien dan dapat diskalakan.

Video terkait: Tip dan trik Node.js

Dalam video penjelas ini, pelajari beberapa teknik yang dapat meningkatkan pengalaman pengembangan Node Anda.

JavaScript IIFE: Ekspresi fungsi yang langsung dipanggil

Ekspresi fungsi yang segera dipanggil (IIFE) adalah fungsi yang dijalankan segera setelah dibuat. Itu tidak memiliki koneksi dengan acara apa pun atau eksekusi asynchronous. Anda dapat menentukan IIFE seperti yang ditunjukkan di bawah ini:

(function () {

// semua kodemu di sini

// ...

}) ();

Pasangan tanda kurung pertama function(){...}mengubah kode di dalam tanda kurung menjadi ekspresi. Pasangan tanda kurung kedua memanggil fungsi yang dihasilkan dari ekspresi tersebut. IIFE juga dapat dijelaskan sebagai fungsi anonim yang memanggil sendiri. Penggunaannya yang paling umum adalah untuk membatasi ruang lingkup variabel yang dibuat melalui varatau untuk merangkum konteks untuk menghindari benturan nama.

Penutupan JavaScript

Penutupan dalam JavaScript adalah fungsi dalam yang memiliki akses ke cakupan fungsi luarnya, bahkan setelah fungsi luar mengembalikan kontrol. Penutupan membuat variabel dari fungsi bagian dalam menjadi pribadi. Contoh sederhana closure ditunjukkan di bawah ini:

var count = (function () {

    var _counter = 0;

    fungsi pengembalian () {return _counter + = 1;}

}) ();

menghitung();

menghitung();

menghitung();

> // penghitung sekarang 3

Variabel countdiberi fungsi luar. Fungsi luar hanya berjalan sekali, yang menyetel penghitung ke nol dan mengembalikan fungsi dalam. The _countervariabel dapat diakses hanya oleh fungsi batin, yang membuatnya berperilaku seperti variabel pribadi.

Prototipe JavaScript

Setiap fungsi JavaScript memiliki properti prototipe yang digunakan untuk melampirkan properti dan metode. Properti ini tidak dapat dihitung. Ini memungkinkan pengembang untuk melampirkan metode atau fungsi anggota ke objeknya. JavaScript mendukung pewarisan hanya melalui properti prototipe. Dalam kasus objek yang diwarisi, properti prototipe mengarah ke induk objek. Pendekatan umum untuk melampirkan metode ke suatu fungsi adalah dengan menggunakan prototipe seperti yang ditunjukkan di bawah ini:

function Rectangle (x, y) {

    this._length = x;

    this._breadth = y;

}

Rectangle.prototype.getDimensions = function () {

    return {length: this._length, breadth: this._breadth};

};

Rectangle.prototype.setDimensions = fungsi (len, bred) {

    this._length = len;

    this._breadth = dibesarkan;

};

Properti pribadi JavaScript, menggunakan closures

JavaScript memungkinkan Anda menentukan properti pribadi dengan menggunakan awalan garis bawah seperti yang ditunjukkan pada contoh di atas. Namun, ini tidak mencegah pengguna untuk langsung mengakses atau memodifikasi properti yang seharusnya bersifat pribadi.

Mendefinisikan properti pribadi menggunakan closure akan membantu Anda mengatasi masalah ini. Fungsi anggota yang membutuhkan akses ke properti privat harus didefinisikan pada objek itu sendiri. Anda dapat membuat properti pribadi menggunakan closure seperti yang ditunjukkan di bawah ini:

function Rectangle (_length, _breadth) {

     this.getDimensions = function () {

     return {length: _length, breadth: _breadth};

     };

     this.setDimension = function (len, bred) {

     _length = len;

    _breadth = dibesarkan

    };

}

Pola Modul JavaScript

Pola Modul adalah pola desain yang paling sering digunakan dalam JavaScript untuk mencapai kode yang terstruktur dengan baik dan digabungkan secara longgar. Ini memungkinkan Anda untuk membuat tingkat akses publik dan pribadi. Salah satu cara untuk mencapai pola Modul ditunjukkan di bawah ini:

var Direction = (function () {

  var _direction = 'maju'

  var changeDirection = function (d) {

          _direction = d;

  }

  kembalikan {setDirection: function (d) {

          changeDirection (d);

          console.log (_direction);

          }

  };

}) ();

Direction.setDirection ('mundur'); // Keluaran: 'mundur'

console.log (Direction._direction);

Pola Revealing Module mirip dengan pola Module dimana variabel dan metode yang perlu diekspos dikembalikan dalam literal objek. Contoh di atas dapat ditulis dengan menggunakan pola Revealing Module sebagai berikut:

var Direction = (function () {

  var _direction = 'maju';

  var _privateChangeDirection = function (d) {

_direction = d;

  }

  kembali {

          setDirection: _privateChangeDirection

  };

}) ();

Mengangkat JavaScript

JavaScript memindahkan variabel dan deklarasi fungsi ke atas cakupannya sebelum eksekusi kode. Ini disebut mengangkat. Terlepas dari di mana Anda menempatkan deklarasi fungsi dan variabel dalam kode Anda, mereka dipindahkan ke bagian atas cakupannya oleh interpreter. Ini mungkin atau mungkin tidak berada di tempat yang Anda inginkan. Jika tidak, maka program Anda akan error.

Deklarasi variabel diproses sebelum kode apa pun dieksekusi. Ironisnya, variabel yang tidak dideklarasikan tidak ada sampai mereka diberi nilai. Hal ini menyebabkan semua variabel yang tidak dideklarasikan menjadi variabel global. Meskipun deklarasi fungsi dinaikkan, ekspresi fungsi tidak dinaikkan. JavaScript memiliki urutan prioritas sambil mengangkat variabel dan fungsi.

Prioritas diberikan di bawah ini dari yang lebih tinggi ke lebih rendah:

  • Penugasan variabel
  • Deklarasi fungsi
  • Deklarasi variabel

Untuk menghindari bug, Anda harus mendeklarasikan variabel dan fungsi Anda di awal setiap cakupan. 

Kari JavaScript

Kari adalah metode untuk membuat acara lebih fleksibel. Dengan fungsi curried, Anda bisa meneruskan semua argumen yang diharapkan fungsi tersebut dan mendapatkan hasilnya, atau Anda bisa meneruskan hanya subset argumen dan menerima kembali fungsi yang menunggu argumen lainnya. Contoh sederhana dari kari diberikan di bawah ini:

var myFirstCurry = fungsi (kata) {

  fungsi pengembalian (pengguna) {

            return [kata, ",", pengguna] .join ("");

  };

};

var HelloUser = myFirstCurry ("Halo");

HelloUser ("Rahul"); // Keluaran: "Halo, Rahul"

Fungsi asli curried dapat dipanggil secara langsung dengan melewatkan setiap parameter dalam tanda kurung terpisah satu demi satu seperti yang ditunjukkan di bawah ini:

myFirstCurry ("Hey, wassup!") ("Rahul"); // Output: "Hei, ada apa !, Rahul"

JavaScript menerapkan, memanggil, dan mengikat metode

Ini penting untuk setiap pengembang JavaScript untuk memahami perbedaan antara call, applydan bindmetode. Ketiga fungsi tersebut serupa karena argumen pertamanya selalu berupa nilai "ini", atau konteks, yang ingin Anda berikan pada fungsi tempat Anda memanggil metode tersebut.

Dari ketiganya, callini yang paling mudah. Ini sama dengan memanggil fungsi sambil menentukan konteksnya. Berikut contohnya:

var user = {

     nama: "Rahul Mhatre",

     whatIsYourName: function () {

     console.log (this.name);

     }

};

user.whatIsYourName (); // Keluaran: "Rahul Mhatre",

var user2 = {

     nama: "Neha Sampat"

};

user.whatIsYourName.call (user2); // Keluaran: "Neha Sampat"

Perhatikan bahwa applyhampir sama dengan call. Satu-satunya perbedaan adalah Anda meneruskan argumen sebagai larik dan tidak secara terpisah. Array lebih mudah dimanipulasi dalam JavaScript, membuka lebih banyak kemungkinan untuk bekerja dengan fungsi. Berikut ini contoh penggunaan applydan call:

var user = {

     menyapa: "Halo!",

     greetUser: function (userName) {

     console.log (this.greet + "" + userName);

     }

};

var greet1 = {

     greet: "Hola"

};

user.greetUser.call (greet1, "Rahul") // Output: "Hola Rahul"

user.greetUser.apply (greet1, ["Rahul"]) // Output: "Hola Rahul"

The bindMetode memungkinkan Anda untuk melewatkan argumen untuk fungsi tanpa melibatkan hal itu. Fungsi baru dikembalikan dengan argumen yang dibatasi sebelum argumen selanjutnya. Berikut ini contohnya:

var user = {

     menyapa: "Halo!",

     greetUser: function (userName) {

     console.log (this.greet + "" + userName);

}

};

var greetHola = user.greetUser.bind ({greet: "Hola"});

var greetBonjour = user.greetUser.bind ({greet: "Bonjour"});

greetHola ("Rahul") // Output: "Hola Rahul"

greetBonjour ("Rahul") // Output: "Bonjour Rahul"

Memo JavaScript

Memoization adalah teknik pengoptimalan yang mempercepat eksekusi fungsi dengan menyimpan hasil operasi yang mahal dan mengembalikan hasil yang di-cache ketika rangkaian input yang sama terjadi lagi. Objek JavaScript berperilaku seperti array asosiatif, membuatnya mudah untuk mengimplementasikan memoisasi di JavaScript. Misalnya, kita dapat mengubah fungsi faktorial rekursif menjadi fungsi faktorial memo seperti yang ditunjukkan di bawah ini:

function memoizeFunction (func) {

  var cache = {};

  fungsi kembali () {

          var key = argumen [0];

          jika (cache [key]) {

          mengembalikan cache [kunci];

          }

          lain {

          var val = func.apply (ini, argumen);

          cache [key] = val;

          kembali val;

          }

  };

}

var fibonacci = memoizeFunction (fungsi (n)

  kembali (n === 0);

Kelebihan metode JavaScript

Metode overloading memungkinkan beberapa metode memiliki nama yang sama tetapi dengan argumen yang berbeda. Compiler atau interpreter menentukan fungsi mana yang akan dipanggil berdasarkan jumlah argumen yang diteruskan. Metode overloading tidak secara langsung didukung di JavaScript. Tetapi Anda dapat mencapai sesuatu seperti yang ditunjukkan di bawah ini:

function overloadMethod (object, name, fn) {

     if (! object._overload) {

    object._overload = {};

     }

     if (! object._overload [name]) {

    object._overload [name] = {};

    }

     if (! object._overload [name] [fn.length]) {

object._overload [nama] [fn.length] = fn;

    }

     objek [nama] = fungsi () {

         if (this._overload [name] [arguments.length])

         kembalikan this._overload [nama] [arguments.length] .apply (ini, argumen);

     };

function Students () {

  overloadMethod (ini, "temukan", fungsi () {

          // Temukan siswa dengan nama

  });

overloadMethod (ini, "temukan", fungsi (pertama, terakhir) {

          // Temukan siswa dengan nama depan dan belakang

  });

}

var students = new Students ();

siswa.find (); // Menemukan semua

students.find ("Rahul"); // Menemukan siswa berdasarkan nama

students.find ("Rahul", "Mhatre"); // Menemukan pengguna dengan nama depan dan belakang

Saat Anda menguasai Node.js, Anda akan melihat ada banyak cara untuk menyelesaikan hampir setiap masalah. Tapi mengambil pendekatan yang tepat itu penting. Pendekatan yang salah akan mengakibatkan beberapa efek samping seperti aplikasi yang tidak stabil atau bermasalah atau regresi yang memaksa Anda untuk menulis ulang seluruh logika. Di sisi lain, pendekatan yang tepat akan meletakkan dasar untuk aplikasi yang kuat, efisien, dan skalabel.

10 konsep JavaScript yang dijelaskan dalam artikel ini adalah dasar-dasar yang harus diketahui oleh setiap pengembang Node.js. Tapi mereka adalah puncak gunung es. JavaScript itu kuat dan kompleks. Semakin sering Anda menggunakannya, semakin Anda akan memahami betapa luasnya JavaScript sebenarnya. Pemahaman yang lebih baik tentang bahasa yang begitu luas pasti akan membantu Anda menghindari kesalahan. Sementara itu, pelajari dasar-dasarnya dengan benar dan Anda akan melihat hasil yang luar biasa.

Rahul Mhatre adalah pemimpin tim pengembang di Software AG. Sebelumnya dia adalah arsitek teknis di Built.io, yang diakuisisi oleh Software AG. 

-

Forum Teknologi Baru menyediakan tempat untuk mengeksplorasi dan mendiskusikan teknologi perusahaan yang sedang berkembang secara mendalam dan luas. Pemilihannya subjektif, berdasarkan pilihan teknologi yang kami yakini penting dan paling menarik bagi pembaca. tidak menerima jaminan pemasaran untuk publikasi dan berhak untuk mengedit semua konten yang dikontribusikan. Kirim semua pertanyaan ke [email protected]