Nối tiếp các bài viết trước, trong bài viết này, tôi sẽ trình bày cách khai báo thuộc tính và phương thức tĩnh (public/private static) khi cài đặt lớp với javascript.
Thuộc tính tĩnh lưu giá trị không phụ thuộc vào các thể hiện của lớp đó, đối với các private static property thì chúng chỉ được truy cập từ trong các method của class đó. Phương thức tĩnh cũng tương tự như vậy.
Khai báo và cài đặt mẫu
Sau đây tôi sẽ đưa ra cách cài đặt mà tôi hay sử dụng để khai báo các thuộc tính và phương thức tĩnh sử dụng thêm khai báo namespace (tham khảo bài: namespace) dựa trên mẫu định nghĩa class (tham khảo bài: định nghĩa class với javascript):
// định nghĩa namespace vn.eten.tek vn = vn || {}; vn.eten = vn.eten || {}; vn.eten.tek = vn.eten.tek || {}; // định nghĩa private static variable, property, method tại đây var privateStaticVariable = 1; function privateStaticProperty(value){ if (typeof (value) === 'undefined') return privateStaticVariable; // thực hiện validate value nếu cần privateStaticVariable = value; } function privateStaticMedhod(params){ // thân hàm private static medthod } // định nghĩa class Sample trong namespace vn.eten.tek vn.eten.tek.Sample = function(){ // định nghĩa class Sample như trong các bài trước // định nghĩa: // private variable // private property // private method // public property // public method } // định nghĩa public static variable, property, method tại đây vn.eten.tek.Sample.publicStaticVariable = 0; vn.eten.tek.Sample.publicStaticProperty = function(value) { /*Cài đặt*/ } vn.eten.tek.Sample.publicStaticMethod = function(params) { /*Cài đặt*/ }
Khả năng truy cập
Các private static được truy cập ở bất cứ đâu bằng cách gọi trực tiếp tên của nó (ví dụ như trong function privateStaticProperty(value)).
Các public static khi truy cập phải ghi rõ đầy đủ namespace, tên class và tên thuộc tính hay phương thức static này. Các public static này cũng được truy cập từ bất cứ đâu trong class hoặc ở bên trong các method của các class khác.
Cài đặt ví dụ minh họa
Tôi sẽ sử dụng lại ví dụ đã dùng trong Part 1, tôi sẽ cài đặt một lớp thể hiện các tính chất của một hình hộp:
// định nghĩa namespace vn.eten.tek vn = vn || {}; vn.eten = vn.eten || {}; vn.eten.tek = vn.eten.tek || {}; /// Định nghĩa Private Static Variable var edge = 12; // số cạnh /// Định nghĩa Private Static Method function isNumber(x) { // hàm cho biết có phải là số hay không return !isNaN(x); } // định nghĩa class Rectangular trong namespace vn.eten.tek vn.eten.tek.Rectangular = function (width, high, deep) { var _this = this; /// Định nghĩa Private Property var _width, _high, _deep; /// Định nghĩa Private Method function isPositive(x) { // sử dụng Private Static Method return isNumber(x) && x > 0; } /// Định nghĩa Public Property this.width = function (value) { if (typeof (value) === 'undefined') return _width; if (!isPositive(value)) throw "Value phải là số dương"; _width = value; }; this.high = function (value) { if (typeof (value) === 'undefined') return _high; if (!isPositive(value)) throw "Value phải là số dương"; _high = value; }; this.deep = function (value) { if (typeof (value) === 'undefined') return _deep; if (!isPositive(value)) throw "Value phải là số dương"; _deep = value; }; /// Định nghĩa Public Method this.getVolume = function () { return _this.width() * _this.high() * _this.deep(); }; /// Định nghĩa Public CONSTRUCTION (function () { _this.width(width); _this.high(high); _this.deep(deep); })(); }; /// Định nghĩa Public Static Variable ETEN.sample.Rectangular.color = "black"; /// Định nghĩa Public Static Method ETEN.sample.Rectangular.getEdge = function () { return edge; };
Sử dụng class trên:
alert(vn.eten.tek.Rectangular.color); // black vn.eten.tek.Rectangular.color = "red"; alert(vn.eten.tek.Rectangular.color); // red alert(vn.eten.tek.Rectangular.getEdge()); // 12 var rec = new vn.eten.tek.Rectangular(1, 2, 3); alert(rec.getVolume()); // 6 rec.width(4); alert(rec.getVolume()); // 24
Như vậy ta đã có thể xây dựng được đầy đủ các biến, thuộc tính, phương thức dạng private, public và có thể kèm theo static. Trong bài viết sau tôi sẽ trình bày cách cục bộ hóa biến, module hóa khối lệnh và kiểm tra sự tồn tại của các class khác, thư viện khác có liên quan đến trong quá trình cài đặt lớp.
Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!