Maintainable Javascript - Do Not Modify Object You Do Not Own

March 08, 2015

Preventing Modification

ECMAScript 5, giờ thì cứ hiểu Js vì chưa bao giờ thực sự đọc để phân biệt js và ECMAScript chỉ biết hình như js là wrapper của ECMAScript :v, có cung cấp một vài phương thức khóa một đối tượng với mực độ khác nhau ngăn chặn ai đó vô tình hay cố ý chỉnh sửa đối tượng không nên được sửa.

Browser hỗ trợ: Chrome, Opera 12+, IE 9+, Firefox 4+, Safari 5+

Các phương thức được chia làm 3 cấp với độ “mạnh” tằng dần như sau:

Mỗi cấp trên có 2 phương thức, một dùng thể khóa một dùng để kiểm tra đã khóa chưa. Như vậy đây là mèo Tom khóa cửa và nuốt luôn chìa khóa không thể nào mở lại được nữa do đó ta phải cẩn thận khi dùng các phương thức này.

Cấp Prevent extension: Object.preventExtension() và Object.isExtensible()

1
2
3
4
5
6
7
8
9
var person = {
	name: "Khang"
};

Object.preventExtension(person);			//khóa

Object.isExtenalbe(person);		//trả về false

person.age = 22;				//lỗi


Khi gán thêm thuộc tính mới cho object person chắc chắn lệnh náy sẽ không thành công do ta đã khóa lại rồi, tuy nhiên nên lưu ý thông thường lệnh này sẽ lỗi một cách lặng lẽ mà không quăng ra bất kì thông báo nào cả. Trường hợp ta đang ở strict mode nó sẽ chửi vào mặt ta. Nguyên tắc này cũng áp dụng cho các cấp độ khóa khác khi ta vi phạm quy ước khóa của cấp đó.

Cấp Seal: Object.seal() và Object.isSeal()

1
2
3
4
5
6
7
8
...
Object.seal(person);
   
Object.isExtensible(person);		//false
Object.isSeal(person);				//true

delete person.name; 				//lỗi
person.age = 21;					//lỗi


Cấp Freeze: Object.freeze() và Object.isFrozen()

1
2
3
4
5
6
7
8
9
10
...
Object.freeze(person);

Object.isExtensible(person);		//false
Object.isSeal(person);				//true
Object.isFronzen(person); 			//true

person.name = "Khang Nguyen-Le";	//lỗi	
delete person.name; 				//lỗi
person.age = 21;					//lỗi