js-OOP: Khai báo thuộc tính và phương thức tĩnh khi cài đặt class với javascript – Part 3

js-OOP: Khai báo thuộc tính và phương thức tĩnh khi cài đặt class với javascript – Part 3

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!