- vừa được xem lúc

Module Pattern trong Javascript

0 0 31

Người đăng: Hunq Vux

Theo Viblo Asia

Việc giới hạn phạm vi ảnh hưởng và khả năng bị ảnh hưởng của các property và các biến và một việc cực kỳ quan trọng thế nhưng, Javascript lại không phải là một ngôn ngữ OOP và nó cũng không có cơ chế riêng cho phép chúng ta tạo ra các private property cho instance của các constructor function. Tuy nhiên, bằng việc áp dụng module pattern, chúng ta hoàn toàn có thể làm được điều này một cách dễ dàng.

Khời tạo một Module

Module cho phép chúng đóng gói các property, method, biến và function bằng cách tận dụng một đặc điểm rất đặc trưng của Javascript đó là closure. Các closure sẽ được tạo ra mỗi khi một function bất kỳ được tạo ra và đây cũng chính là cách mà ta tạo ra một module, đó là tạo ra một IIFE(Immediately Invoked Function Expression), một function tự gọi đến chính nó.

var testModule = (function() { var counter = 0; // biến này đã được cô lập bởi closure của function này ...
})();

Bằng cách khởi tạo biến counter bên trong một IIFE chúng ta đã giới hạn phạm vi bị tác động của counter giờ đây, ngoài các đoạn code bên trong IIFE này ra thì các đoạn code bên ngoài không thể truy cập cũng như sử dụng được biến counter. Ngoài các biến thì chúng ta cũng có thể khởi tạo các private function bằng cách này.

Export các method và property

Chúng ta đã biết cách tạo ra các biến private, nhưng để có thể sử dụng được các module thì chúng ta cần export các property cũng như các method hoặc đơn giản chỉ là các biến hoặc function ra bên ngoài.

var testModule = (function() { var counter = 0; return { getCounter() { return counter; }, increateCounter() { counter++; }, resetCounter() { counter = 0; } }
})(); for (var i = 0; i < 10; i++) { testModule.increateCounter();
}
console.log(testModule.getCounter()); // 10 testModule.resetCounter();
console.log(testModule.getCounter()); // 0 console.log(testModule.counter); // undefined

Như các bạn có thể thấy, biến counter không thể bị truy cập từ bên ngoài module testModule, nhưng chúng ta vẫn có thể cho phép các developer khác thực hiện các tác vụ liên quan đến counter thông qua các method mà ta cho export ra cho họ sử dụng.

Global import

Khi phân tích kỹ cú pháp của IIFE thì các bạn có thể thấy tất cả những gì mà ta làm chỉ là truyền một function expression vào một cặp dấu () để tránh Javascript hiểu lầm cặp dấu{} của function expression mà ta truyền vào () là cú pháp khời tạo Object hoặc chúng là cặp dấu {} của các statement như if, switch,... và sau đó ta sẽ dùng thêm một cặp dấu () nữa để chạy function expression mình vừa đề cập ở trên.

Tất cả những gì chúng ta tạo ra 1 IIFE chỉ là chạy một function expression. Ngoài việc giúp cho code của chúng ta ngắn hơn và ta không phải tạo thêm một biến để chứa function expression đó thì nó không khác gì lắm với ví dụ dưới đây cả.

var functionExpression = function() {} functionExpression();

Chính vì bản chất đơn giản của IIFE mà ta hoàn toàn có thể truyền một biến vào trong IIFE tương tự như khi ta truyền một biến vào trong một function.

var globalVar = 'test'; var testModule = (function(global) { console.log(global);
})(globalVar);

Trong Module pattern thì việc truyền một biến bên ngoài vào 1 module được gọi là global import.

Với các module bị phụ thuộc vào các thư module khác và các module khác này lại nằm ở các file khác nhau thì các bạn có thể áp dụng gobal import như ví dụ dưới đây chẳng hạn.

var testModule = (function($) { const bodyEle = $('body'); ...
})($); // truyền function $ của thư viện jquery vào module testModule

Lời kết

Như các bạn có thể thấy Module mang lại rất nhiều lợi ích ngoài việc định nghĩa các biến và function một cách private thì nó cũng giúp cho việc tái sử dụng trở nên dễ dàng hơn và giảm thiểu xung đột về tên biến đi rất nhiều. Mong rằng qua bài viết này các bạn đã hiểu về pattern này. Chúc các bạn một ngày làm việc vui vẻ và hiệu quả. Cheer !

Bình luận

Bài viết tương tự

- vừa được xem lúc

2021, chúng ta cần tối ưu hóa việc tải hình ảnh trên web như nào?

Rất chào các bạn,. Như các bạn đã biết, trong kỉ nguyên công nghệ, song song với sự sinh ra dày đặc của các trang web mới cũng là sự biến mất của những trang web "lạc hậu" hay hoạt động kém hiệu quả.

0 0 43

- vừa được xem lúc

Cách mình "hack" được vào hẹ thống của SMAS để xem điểm.

Cách mà mình "hack" được vào hệ thống của SMAS. Thật ra dùng từ hack cũng không đúng lắm, chỉ là một vài trick để lừa hệ thống mà thôi.

0 0 124

- vừa được xem lúc

Giải thích một số JAVASCRIPT ARRAY METHOD với EMOJIS

Như chúng ta đã biết, Array trong JS có rất nhiều method tiện dụng có thể hỗ trợ chúng ta. Sau đây là một số method thông dụng được giải thích bằng các emoji. Thêm một hoặc nhiều phần tử vào sau mảng. livestock.

0 0 33

- vừa được xem lúc

Testing trong Javascript với Jest (Phần 1)

Hello 500 anh em, lại là mình đây. Chú bé coder yêu màu tím thích màu hồng và ghét sự giả dối đây .

0 0 249

- vừa được xem lúc

Áp dụng kiến trúc 3 Layer Architecture vào project NodeJS

The problem encountered. Các framework nodejs phổ biết như Express cho phép chúng ta dễ dàng tạo ra Resful API xử lí các request từ phía client một cách nhanh chóng và linh hoạt.

0 0 64

- vừa được xem lúc

Một số String methods cần biết trong javascript

String là một trong những phần quan trọng nhất trong javascript, ngoài những methods hay dùng như trim, concat, subString, toUpperCase, toLowerCase; Javascript còn cung cấp cho chúng ta rất nhiều methods hữu ích khác để thao tác và giải quyết các vấn đề dễ dàng hơn khi làm việc với String. Mặc dù nh

0 0 25