<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://aptech.ac.vn/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Lập trình</title><subtitle type="html" /><id>http://aptech.ac.vn/fpt/programming/atom.aspx</id><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/default.aspx" /><link rel="self" type="application/atom+xml" href="http://aptech.ac.vn/fpt/programming/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-08-18T14:09:00Z</updated><entry><title>Nguồn mở đã kém an toàn hơn</title><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/2009/09/30/ngu-n-m-227-k-233-m-an-to-224-n-h-n.aspx" /><link rel="enclosure" type="image/jpeg" length="20302" href="http://aptech.ac.vn/fpt/programming/attachment/55632.ashx" /><id>http://aptech.ac.vn/fpt/programming/2009/09/30/ngu-n-m-227-k-233-m-an-to-224-n-h-n.aspx</id><published>2009-09-30T05:58:00Z</published><updated>2009-09-30T05:58:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://aptech.ac.vn/blogs/programming/nss_1254196762.jpg"&gt;&lt;img src="http://aptech.ac.vn/blogs/programming/nss_1254196762.jpg" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="PBody"&gt;Theo đánh giá từ&amp;nbsp;Công ty CMC InfoSec, xu hướng
công khai mã nguồn của virus hiện&amp;nbsp;đang hình thành. Việc công khai mã
nguồn virus đã góp phần làm cho số lượng mã&amp;nbsp;độc (malware) tăng lên
không ngừng cả về số lượng lẫn mức độ nguy hiểm. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Bất kì một tác giả viết virus nào có kiến thức
bình thường về hệ thống, nếu có mã virus trong tay thì đều có thể thay
đổi mã virus để tạo ra biến thể mới. Đây là một thách thức không nhỏ
cho các hãng sản xuất phần mềm diệt virus. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Bên cạnh đó, các hãng bảo mật trên thế giới cũng
nhận định rằng các phần mềm bảo mật hiện nay đã bị virus &amp;quot;vượt mặt&amp;quot; về
khả năng phản ứng. Chính vì vậy,&amp;nbsp;các hãng bảo mật đang liên tục nghiên
cứu những công nghệ và kĩ thuật mới để mang lại hiệu quả tốt nhất trong
việc hạn chế và ngăn chặn tốc độ bùng phát của virus hiện nay. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Trước đây, những kẻ viết virus thường dồn sức
tấn công nền tảng Windows, vì sản phẩm này chiếm thị phần rất lớn trên
thế giới, tuy nhiên hiện nay thị phần máy tính sử dụng mã nguồn mở Mac
và Unix/Linux gia tăng và trở thành mỏ vàng thu hút sự quan tâm của
giới tin tặc.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Hệ điều hành nguồn mở không còn an toàn nữa, tác
giả mã độc đang nỗ lực di chuyển địa bàn hoạt động sang những máy tính
mã nguồn mở bằng cách tiền hành cài đặt phần mềm mã độc trong hệ điều
hành mở để đánh cắp thông tin tài chính, thông tin cá nhân, và họ còn
hy vọng mở rộng thêm tính năng của các Trojan cũ. Ở đâu sinh lợi ở đó
có tội phạm. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Sự gia tăng tấn công các máy chủ web sử dụng hệ
điều hành Linux gia tăng, trong khi đó những vụ tấn công vào hệ thống
Windows cũng không có dấu hiệu giảm. Hệ điều hành mã nguồn mở cũng có
những lỗ hổng và tất cả các lỗ hổng bảo mật trên các loại hệ thống đều
có thể bị khai thác.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Người dùng quá tin tưởng vào sự an toàn của hệ
điều hành mã nguồn mở với quan niệm “Hệ điều hành mã nguồn mở không bị
virus tấn công”. Giờ đây người dùng cần phải thay đổi cách nghĩ này và
cần phải biết không có hệ điều hành là an toàn nếu như họ không có biện
pháp bảo vệ.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="PBody"&gt;Vì thế, các nhà cung cấp giải pháp bảo mật cần
phải chuẩn bị một lượng tài chính tương đối để đầu tư cho công việc
ngăn chặn việc tấn công hệ thống mã nguồn mở.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://aptech.ac.vn/aggbug.aspx?PostID=55632" width="1" height="1"&gt;</content><author><name>giangdh</name><uri>http://aptech.ac.vn/members/giangdh.aspx</uri></author></entry><entry><title>Học nghề thiết kế web</title><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/2008/09/29/h-c-ngh-thi-t-k-web.aspx" /><link rel="enclosure" type="image/gif" length="15260" href="http://aptech.ac.vn/fpt/programming/attachment/12572.ashx" /><id>http://aptech.ac.vn/fpt/programming/2008/09/29/h-c-ngh-thi-t-k-web.aspx</id><published>2008-09-29T06:28:00Z</published><updated>2008-09-29T06:28:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://aptech.ac.vn/blogs/programming/small_1222423329.nv.jpg"&gt;&lt;img src="http://aptech.ac.vn/blogs/programming/small_1222423329.nv.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;p&gt;Nếu bạn muốn bước chân vào lãnh vực này thì bài viết sẽ gợi ý cho bạn
cần chuẩn bị ra sao, học theo những môn nào... Không cần phải vắt óc và
căng thẳng vì các thuật toán như trong ngành công nghệ phần mềm, bạn
vẫn có thể đeo đuổi được niềm đam mê lập trình của mình qua nghề thiết
kế trang web. Với khoảng 1/4 dân số Việt Nam đang sử dụng Internet hàng
ngày như hiện nay và các dịch vụ kinh doanh qua mạng Internet đang gia
tăng từng ngày..., bạn không phải lo đến chuyện đất dụng võ khi học
nghề thiết kế web. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kỹ năng mỹ thuật&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://aptech.ac.vn/blogs/programming/1221624782_websiteDesign1.gif"&gt;&lt;img src="http://aptech.ac.vn/blogs/programming/1221624782_websiteDesign1.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;Về cơ bản, bạn chỉ cần biết dùng tương đối thành thạo các phần mềm đồ
họa như Photoshop, Flash, CorelDraw là có thể đảm đương được khâu thiết
kế giao diện, thường là trang chủ, cho một website. Photoshop sẽ giúp
bạn xử lý một số hình ảnh làm hình nền cho trang web, tạo các nút bấm,
ghép hình để tạo banner, hoặc dùng tiện ích ImageReady có trong bộ
Photoshop để tạo ra các hình động dạng GIF. Còn với flash, bạn có thể
tạo được các hình ảnh động dạng SWF có dung lượng nhẹ hơn nhiều so với
dạng GIF, thường dùng làm trang chủ của một website; hơn nữa, flash còn
cho phép bạn nhúng các mã lệnh (như khi lập trình) vào để thực hiện các
thao tác chuyển động thay vì phải tạo ra từng frame như ở ImageReady. &lt;br /&gt;
&lt;br /&gt;
CorelDraw ít được sử dụng trong thiết kế giao diện website nhưng nếu
biết dùng nó, bạn sẽ tạo ra những trang web có giao diện mới lạ nhờ
biết kết hợp nó với 2 phần mềm nói trên. Ngoài ra, bạn cần trang bị
thêm các kiến thức về kỹ thuật phối màu và bố cục trình bày để tạo ra
các giao diện dễ nhìn. Tùy theo từng ngành nghề, các doanh nghiệp
thường chọn các cấu trúc website khác nhau. Có nơi yêu cầu thiết kế
hoàn toàn bằng flash để trình diễn các sản phẩm cho bắt mắt, một số
khác chỉ cần dùng flash ở trang chủ, còn lại đa số đều muốn thiết kế
đơn giản và dễ thao tác. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kỹ năng lập trình&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://aptech.ac.vn/blogs/programming/1221624808_webdesign2.gif"&gt;&lt;img src="http://aptech.ac.vn/blogs/programming/1221624808_webdesign2.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Như đã đề cập ở trên, bạn không cần trang bị nhiều kỹ năng về lập trình
khi thiết kế web. Đầu tiên, bạn sẽ làm quen với các thẻ lệnh HTML để
biết cách dùng chúng, đây là phần kiến thức nền để bạn tiếp cận với lập
trình web. Sau đó, bạn sẽ được làm quen với 1 trong 2 phần mềm
FrontPage hoặc Dreamweaver để tạo nhanh các trang web với thao tác cửa
sổ như khi soạn thảo văn bản trong Word, thay vì phải viết từng thẻ mã
lệnh HTML như trước đó. Và để làm quen với kỹ năng lập trình, bạn sẽ
tiếp cận cách dùng JavaScript. Đơn giản, chỉ cần bấy nhiêu thôi là bạn
đã có thể thiết kế một trang web hoàn chỉnh, tuy nhiên mức độ xử lý
thông tin và khả năng tương tác với khách truy cập chưa nhiều, bởi phần
lớn các chức năng trên trang web là tĩnh. Do vậy, để bước vào con đường
chuyên nghiệp của lập trình web, bạn sẽ học tiếp các ngôn ngữ lập trình
web thực thụ như ASP, PHP cùng với các thao tác trên cơ sở dữ liệu.
Trước tiên, bạn sẽ học về cách tổ chức và thao tác trên cơ sở dữ liệu
bằng phần mềm Access hoặc viết các câu lệnh truy vấn trong SQL hoặc
MySQL. &lt;br /&gt;
&lt;br /&gt;
Vấn đề tổ chức và quản lý cơ sở dữ liệu ở các website động là cực kỳ
quan trọng, nên nếu bạn lĩnh hội được nhiều về cơ sở dữ liệu thì sẽ dễ
dàng tiếp cận thêm các ngôn ngữ lập trình web. Sau đó bạn sẽ học cách
lập trình trong PHP hay ASP, cũng như tạo các server ảo Apache, IIS
(Internet Information Services) để chạy các lệnh vừa lập trình. Ngoài
các ngôn ngữ lập trình trang web, bạn có thể dùng các công cụ phần mềm
nguồn mở có trên mạng Internet để tạo ra các trang web theo cấu trúc có
sẵn. Hiện nay, các công cụ này rất nhiều, bạn có thể chọn vBulletin,
Joomla, Smarty, dojo... Tuy nhiên, bạn cũng phải hiểu biết về lập trình
web để chỉnh sửa và nhúng thêm các chức năng tương tác với khách truy
cập. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Lựa chọn&lt;br /&gt;
&lt;br /&gt;
&lt;/b&gt; Nếu có điều kiện, bạn có thể đăng ký học các lớp kỹ thuật viên
công nghệ web ở các trung tâm tin học, tuy nhiên học phí tương đối cao
vì chương trình học gồm nhiều giai đoạn. Trường hợp đã biết tin học căn
bản, bạn có thể đăng ký học các khóa đào tạo ngắn hạn về Photoshop,
Flash hoặc tự học; sau đó đăng ký học các lớp thiết kế web, lập trình
web. Thời gian học cũng khá nhanh, 18 tháng đối với những người mới bắt
đầu làm quen với máy tính, hoặc vài tháng cho những người biết sử dụng
thành thạo máy tính. Qua phần trình bày trên, bạn có thể học và làm từ
A - Z cho một website, hoặc cũng có thể chỉ đảm nhận phần lập trình tạo
trang web, còn phần thiết kế giao diện trang web nhường lại cho các
đồng nghiệp. Đây cũng chính là xu hướng tổ chức công việc trong các
công ty nhận thiết kế website hiện nay.
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CTThanh - VietCNTT.com&lt;/b&gt;&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://aptech.ac.vn/aggbug.aspx?PostID=12572" width="1" height="1"&gt;</content><author><name>giangdh</name><uri>http://aptech.ac.vn/members/giangdh.aspx</uri></author></entry><entry><title>Đi dạo cùng J2ME - Phần 1</title><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/2008/09/28/i-d-o-c-249-ng-j2me-ph-n-1.aspx" /><id>http://aptech.ac.vn/fpt/programming/2008/09/28/i-d-o-c-249-ng-j2me-ph-n-1.aspx</id><published>2008-09-28T14:23:00Z</published><updated>2008-09-28T14:23:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;J2ME là gì?&lt;/b&gt;&lt;/p&gt; 
 
&lt;p&gt;	J2ME là viết tắt của Java
2 Micro Edition. J2ME được thiết kết cho các thiết
bị nhỏ ví dụ như mobile phone, các thiết bị
điều khiển từ xa, các thiết bị khác như
PDA, v.v... 
&lt;/p&gt; 
 
&lt;p&gt;	Có rất nhiều khác
biệt giữa J2ME và các phiên bản khác
của Java triển khai trên nền PC, mà lí do
chính là các thiết bị mục tiêu của
J2ME có rất nhiều sự khác biệt so với PC.&lt;/p&gt; 
 
&lt;p&gt;	Một vài điểm khác
biệt giữa các “thiết bị J2ME” so với PC là:&lt;/p&gt; 
&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Hạn chế về tốc độ của
			bộ vi xử lý&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hạn chế về bộ nhớ hệ
			thống&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hạn chế về khả năng lưu
			trữ&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Màn hình hiển
			thị nhỏ&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hạn chế về nguồn năng
			lượng&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Khả năng kết nối Internet
			yếu.&lt;/p&gt; 
			
		&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt; 
&lt;p&gt;	J2ME đã được thiết kế
với tất cả những cân nhắc đối với các yếu
tố kể trên. Các thiết bị được thiết kế
tương thích với J2ME đều bao gồm một phiên
bản mini của Java Virtual Machine (JVM) được tích hợp
sẵn trong đó, phiên bản này còn có
tên gọi là KVM, rất nhỏ gọn và phù
hợp với các thiết bị nhỏ. KVM cho phép thực
thi các chương trình Java viết trên nền
J2ME, những chương trình này còn được
gọi là các MIDlet. Các midlet không gì
khác là một chương trình viết bằng Java
(tuy có đôi chút khác biệt) khai thác
các Java API mà J2ME cung cấp, chúng tạo ra
sức mạnh mới cho các thiết bị.&lt;/p&gt; 
 
&lt;p&gt;	Các ứng dụng J2ME có
thể làm được nhiều điều hơn những gì
chúng ta tưởng, một vài trong số chúng có
thể được liệt kê ra đây:&lt;/p&gt; 
 
&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Tạo các kết nối UDP
			(User Datagram Protocol- một giao thức của bộ giao thức
			TCP/IP) tới các server hoặc giữa 2 thiết bị.&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tạo các kết nối
			HTTP tới các HTTP sever từ đó tạo nên
			các ứng dụng phong phú.&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tạo các kết nối
			kiểu Socket&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Quét mã vạch.&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;Lập trình kết nối
			Bluetooth&lt;/p&gt; 
			&lt;/li&gt;&lt;li&gt;&lt;p&gt;.... và còn rất
			nhiều khả năng khác của J2ME phụ thuộc vào
			trí tưởng tượng của bạn.&lt;/p&gt; 
			
		&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt; 
&lt;p&gt;	Về kiến trúc, J2ME có
thể được chia làm 3 tầng như sau:&lt;/p&gt;&lt;p&gt;&lt;img src="http://today.java.net/images/2005/02/j2mestack.gif" alt="" /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Ở đây ta không đi quá
sâu vào phân tích ý nghĩa và
đặc điểm chi tiết các tầng để tránh sự
phức tạp cho bài viết. Các bạn có thể
tham khảo thêm trong nhiều tài liệu về J2ME.
Dưới đây là một vài nét mô tả
sơ lược:&lt;/p&gt; 
 
&lt;ul&gt;&lt;li&gt;&lt;p&gt;Tầng dưới cùng là
	&lt;b&gt;Configuration&lt;/b&gt; (Cấu hình) bao gồm một JVM (một
	phiên bản thu nhỏ của JVM hay còn gọi là
	KVM) và một số các class cơ bản. Hiện tại
	Sun đưa ra 2 cấu hình là CLDC (Connected Limited
	Device Configuration-Cấu hình thiết bị kết nối giới
	hạn) và CDC (Connected Device Configuration- Cấu hình
	thiêt bị kết nối). Bảng dưới đây cho ta thấy
	sự khác biệt giữa 2 loại cấu hình:&lt;/p&gt; 
	
	&lt;table class="CommonTable1" cellpadding="4" cellspacing="1"&gt; 
		 
		 
		 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;br /&gt; 
				&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p align="center"&gt;&lt;b&gt;CLCD&lt;/b&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p align="center"&gt;&lt;b&gt;CDC&lt;/b&gt;&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;Ram&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;32 KB – 512 KB&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;256 KB trở lên&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;Rom&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;128 KB – 512 KB&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;512 KB trở lên&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;Nguồn năng lượng&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Có giới hạn&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Không giới hạn&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;Network&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chậm&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Nhanh&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
	&lt;/table&gt; 
	
&lt;/li&gt;&lt;/ul&gt; 
&lt;ul&gt;&lt;li&gt;&lt;p&gt;Tầng cao hơn là &lt;b&gt;Profile&lt;/b&gt; 
	bao gồm các thư viện lập trình cơ bản dùng
	để phát triển các ứng dụng tương ứng với
	từng dòng thiết bị. Có 3 profile phổ biến là
	MIDP (&lt;span&gt;Mobile Information Device
	Profile&lt;/span&gt; ), PDA profile, và Foundation profile. Mỗi
	profile đó có chứa một tập hợp các API
	khác nhau do vậy ứng dụng phát triển trên
	profile nào chỉ chạy được trên các thiết
	bị hỗ trợ profile đó.&lt;/p&gt; 
	&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tầng trên cùng là
	&lt;b&gt;Optional Packages&lt;/b&gt; (JSR - &lt;span&gt;Java
	Specification Request&lt;/span&gt;) bao gồm các gói thư
	viện lập trình bổ xung, khi triển khai ứng dụng
	các gói này cũng phải được phân
	phối theo ứng dụng của bạn (phần lớn đây là
	các gói thư viện mà các nhà
	cung cấp thiết bị di động tích hợp trong sản
	phẩm của họ để phát triển các tính
	năng bổ xung như xử lý âm thanh, đồ họa 3D
	...).&lt;/p&gt; 
&lt;/li&gt;&lt;/ul&gt; 
 
&lt;p&gt;	Cả hai tầng Configuration và
Profile được cung cấp bởi các nhà sản xuất
thiết bị và được nhúng trực tiếp vào
các thiết bị. Trong bài viết này chúng
ta sẽ chỉ tập trung vào configuration và profile
thông dụng nhất được biết đến nhiều là
CLDC và MIDP với các phiên bản là CLDC
1.1 và MIDP 2.0.	&lt;/p&gt; 
 
&lt;p&gt;	Tuy nhiên đối với lập
trình viên thì thường quan tâm đến
các thư viện mà J2ME cung cấp. Bảng sau đây
cho các bạn cái nhìn tổng quan về các
gói thư viện lập trình của CLDC và MIDP:&lt;/p&gt; 
 
 
	&lt;table class="CommonTable1" cellpadding="4" cellspacing="1"&gt; 
		 
		 
		 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;br /&gt; 
				&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Java API packages&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Mô tả&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td rowspan="4"&gt; 
				&lt;p&gt;General APIs:&lt;/p&gt; 
				&lt;p&gt;&lt;br /&gt; 
				&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;java.lang&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các class Java cơ bản&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;java.io&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Quản lý việc xuất/nhập của hệ thống&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;java.util&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các lớp hỗ trợ việc tính thời
				gian và thao tác với tập hợp&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Quản lý kết nối hệ thống&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td rowspan="4"&gt; 
				&lt;p&gt;+ MIDP 1.0&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.io&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Hỗ trợ HTTP&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.lcdui&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Hỗ trợ xử lý giao diện người dùng&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.rms&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Quản lý lưu trữ dữ liệu&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.midlet&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các base class của ứng dụng Java ME&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td rowspan="3"&gt; 
				&lt;p&gt;+ MIDP 2.0&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.media&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Xử lý âm thanh (là một phần của
				gói JSR 135 Java Mobile Media API)&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.lcdui.game&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Hỗ trợ lập trình game&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.pki&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Hỗ trợ bảo mật 
				&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td rowspan="4"&gt; 
				&lt;p&gt;+ Optional packages (JSR)&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.messaging&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Xử lý việc gửi và nhận tin nhắn MMS,
				SMS&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.pim&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Truy cập vào danh  bạ điện thoại&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;javax.microedition.io.file&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Tương tác với các file trong bộ nhớ lưu
				trữ (ổ cứng, thẻ nhớ v.v...).&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;...&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;br /&gt; 
				&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
	&lt;/table&gt; 
 
 
&lt;p&gt;&lt;b&gt;2- Cần những công cụ nào
để lập trình với J2ME?&lt;/b&gt;&lt;/p&gt; 
 
&lt;p&gt;	Để có thể lập trình
các ứng dụng trên nền J2ME (hay còn gọi
là các MIDlets) bạn cần cài tối thiểu
các công cụ sau đây:&lt;/p&gt; 
 
&lt;ul&gt;&lt;li&gt;&lt;p&gt;JDK version 1.4.2 trở lên&lt;/p&gt; 
	&lt;/li&gt;&lt;li&gt;&lt;p&gt;J2ME Wireless toolkit : gói
	phần mềm này cung cấp cho bạn một trình giả
	lập các thiết bị di động  (kèm theo các
	API tương ứng), và công cụ biên dịch,
	debug, v.v... nhưng không kèm theo trình hỗ
	trợ viết code. (các hãng sản xuất thiết bị
	di động thường cung cấp một công cụ riêng
	tương tự tuy nhiên trong bài viết này ta
	sử dụng công cụ của SUN)&lt;/p&gt; 
	&lt;/li&gt;&lt;li&gt;&lt;p&gt;Một ứng dụng hỗ trợ viết
	code: ví dụ JCreator, Eclipse, Netbeans v.v... Với
	JCreator bạn phải cấu hình bằng tay, với Eclipse
	bạn phải cài thêm EclipseME plugin, với Netbeans
	version 6.0 bạn chỉ cần chọn gói Mobility là
	đã đầy đủ, không cần cài thêm
	J2ME wireless toolkit.&lt;/p&gt; 
	
&lt;/li&gt;&lt;/ul&gt; 
&lt;p&gt;	Trong bài viết này
chúng ta sử dụng công cụ Netbeans version 6.0, tất
nhiên để bắt đầu một cách đơn giản bạn
cũng có thể dùng Notepad kết hợp với Sun
wireless toolkit để biên dịch và chạy chương
trình.&lt;/p&gt; 
 
&lt;p&gt;	Trước khi bắt tay vào viết
một ứng dụng cụ thể ta hãy dành một chút
thời gian tìm hiểu cấu trúc thư mục của bộ
J2ME wireless toolkit. Sau khi cài đặt, mặc định trong
môi trương Windows thì thư mục của wireless
toolkit là &lt;a&gt;C:\WTK[version&lt;/a&gt;].
Bảng sau liệt kê các thư mục và chức
năng tương ứng:&lt;/p&gt; 
 
 
	&lt;table class="CommonTable1" cellpadding="4" cellspacing="1"&gt; 
		 
		 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;Folder&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Mô tả&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;appdb&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Thư mục này được trình giả lập truy
				xuất như là hệ thống file sytem của các
				thiết bị di động&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;apps&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các Midlets mẫu hoặc các Midlets do
				toolkit tạo ra.&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;bin&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa toàn bộ các công cụ của bộ
				toolkit&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;docs&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các tài liệu mô tả các
				API cho MIDP 1.0 và MIDP 2.0&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;lib&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các thư viện (các file .jar) của
				MIDP và CLDC và các gói thư viện
				tùy chọn&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;sessions&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Lưu network và profiling session&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
		&lt;tr&gt; 
			&lt;td&gt; 
				&lt;p&gt;&lt;i&gt;wtkbin&lt;/i&gt;&lt;/p&gt; 
			&lt;/td&gt; 
			&lt;td&gt; 
				&lt;p&gt;Chứa các thư viện riêng của bộ toolkit
				và các thư mục cấu hình cho các
				thiết bị giả lập&lt;/p&gt; 
			&lt;/td&gt; 
		&lt;/tr&gt; 
	&lt;/table&gt; 
 
 
&lt;p&gt;----------to be continued----------&lt;/p&gt;	&lt;img src="http://aptech.ac.vn/aggbug.aspx?PostID=12308" width="1" height="1"&gt;</content><author><name>tunn</name><uri>http://aptech.ac.vn/members/tunn.aspx</uri></author><category term="Lập tr&amp;#236;nh" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/L_AD1E_p+tr_26002300_236_3B00_nh/default.aspx" /><category term="J2ME" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/J2ME/default.aspx" /><category term="Java" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/Java/default.aspx" /></entry><entry><title>JavaScript và lập trình hướng đối tượng - Phần 3</title><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/2008/08/18/javascript-v-224-l-p-tr-236-nh-h-ng-i-t-ng-ph-n-3.aspx" /><link rel="enclosure" type="image/jpeg" length="3965" href="http://aptech.ac.vn/fpt/programming/attachment/1735.ashx" /><id>http://aptech.ac.vn/fpt/programming/2008/08/18/javascript-v-224-l-p-tr-236-nh-h-ng-i-t-ng-ph-n-3.aspx</id><published>2008-08-18T07:28:00Z</published><updated>2008-08-18T07:28:00Z</updated><content type="html">&lt;p&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="3"&gt;&lt;b&gt;4-
Private &amp;amp; public&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hầu
hết các ngôn ngữ lập trình hướng đối
tượng quen thuộc như Java hay C# đều hỗ trợ từ khóa
public và private cho các thuộc tính cũng như
phương thức trong class. Với JavaScript chúng ta cũng
có thể tạo ra các pattern để giả lập hai từ
khóa này trong các class (cũng giả lập
luôn!!):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Private
	variables&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	những biến được khai báo với từ khóa &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;var&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;
	bên trong object, chỉ có thể được truy nhập
	bởi các hàm riêng (private functions) hoặc
	các phương thức đặc quyền(&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;privileged
	methods&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;)
	của object.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Private
	functions&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	những hàm được khai báo kiểu inline hoặc
	khai báo kiểu &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;var
	functionName=function(){...}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;
	và được truy cập bởi các phương thức đặc
	quyền bên trong object.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Privileged
	methods&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	những hàm được khai báo kiểu
	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;this.methodName=function(){...}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;
	bên trong object. Những hàm này có thể
	được gọi bên ngoài tới object.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Public
	property&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	là những thuộc tính được khai báo kiểu
	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;this.propertyName&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;,
	những thuộc tính này có thể thay đổi
	từ bên ngoài của object.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Public
	method&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	là những phương thức được khai báo kiểu
	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;ClassName.prototype.methodName=function(){...}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;,
	những phương thức này có thể được gọi từ
	bên ngoài object.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Static
	property&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	những thuộc tính được khai báo kiểu
	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;ClassName.propertyName=someValue&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Prototype
	property&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
	những thuộc tính được khai báo kiểu
	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;ClassName.prototype.propertyName=someValue&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hoặc
chúng ta có thể xây đựng một cách
đơn giản theo các Pattern dưới đây:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;b&gt;Public&lt;/b&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;Constructor&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
= &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;value&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;Constructor&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;.prototype.&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
= &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;value&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;b&gt;Private&lt;/b&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;Constructor&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	var
that = this;&lt;br /&gt;	var &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
= &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;value&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	function
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //chú
ý &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //có
thể thay thế cho &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;var
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
= function &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;b&gt;Privileged&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;Constructor&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;i&gt;membername&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;
= function (&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;)
{&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;...&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;


&lt;p&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="3"&gt;&lt;b&gt;5-
Kế thừa với prototype&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nếu
như các bạn đã từng tìm hiểu về kế
thừa với JavaScript thì hẳn các bạn nhận ra
rằng có khá nhiều cách để cài đặt,
tuy nhiên trong bài viết này tôi sẽ chỉ
giới thiệu một cách mà theo cá nhân
là khá đơn giản và tiện lợi khi triển
khai, đó là sử dụng prototype và
constructor.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trước
hết, giả sử chúng ta có hai class ParentClass và
ChildClass. Để thực hiện cho ChildClass kế thừa
ParentClass ta lần lượt các bước sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;
	&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Cho prototype của
	ChildClass là một thể hiện của
	ParentClass:ChildClass.prototype=new ParentClass();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;
	&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Cài đặt lại
	thuộc tính constructor cho ChildClass:
	ChildClass.prototype.constructor=ChildClass;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Như
vậy với hai bước đơn giản ta đã thực hiện được
kế thừa trong JavaScript. Tuy nhiên còn khá
nhiều vấn đề nảy sinh trong khi bạn xây dựng các
class phức tạp, ví dụ như làm thế nào
để gọi phương thức của ParentClass trong khi ChildClass đã
overridden nó, hay vấn đề về virtual class tức là
class chỉ có thể kế thừa mà không cho
phép tạo một thể hiện cho nó. Chúng ta
sẽ lần lượt giải quyết vấn đề này tiếp sau
đây.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nhưng
trước khi đi vào các vấn đề đã nêu
ta hãy làm một ví dụ thú vị sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Class
Động vật có vú&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function
Mammal(name){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	this.name=name;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.offspring=[];//Mùa
sinh sản!!!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Phương
thức sinh con (hoặc có con)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Mammal.prototype.haveABaby=function(){
  &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
newBaby=new Mammal(&amp;quot;Baby &amp;quot;+this.name);  
	this.offspring.push(newBaby);   &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
newBaby;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Hàm
trả về tên con vật&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Mammal.prototype.toString=function(){
  &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
&amp;#39;[Mammal &amp;quot;&amp;#39;+this.name+&amp;#39;&amp;quot;]&amp;#39;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Class
Mèo kế thừa Class Động vật có vú&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Cat.prototype
= new Mammal();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Cat.prototype.constructor=Cat;
     &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Constructor
của class Cat&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;function
Cat(name){   &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Hàm
trả về tên con vật&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;Cat.prototype.toString=function(){
  &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
&amp;#39;[Cat &amp;quot;&amp;#39;+this.name+&amp;#39;&amp;quot;]&amp;#39;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Tạo
Mr.Bill !!!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;var
someAnimal = new Mammal(&amp;#39;Mr. Bill&amp;#39;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Tạo
mèo Tom&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;var
myPet = new Cat(&amp;#39;Tom&amp;#39;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;alert(&amp;#39;someAnimal
is &amp;#39;+someAnimal); &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;pre style="margin-left:0.49in;"&gt;&lt;code&gt;&lt;font size="2"&gt;//Trả về &amp;#39;someAnimal is [Mammal &amp;quot;Mr. Bill&amp;quot;]&amp;#39;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;alert(&amp;#39;myPet
is &amp;#39;+myPet);   &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;pre style="margin-left:0.49in;"&gt;&lt;code&gt;&lt;font size="2"&gt;//Trả về &amp;#39;myPet is [Cat &amp;quot;Tom&amp;quot;]&amp;#39;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Cho
mèo sinh con (kế thừa từ Mammal)           &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;myPet.haveABaby();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;//Thông
báo về số con của mèo Tom                    &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;alert(myPet.offspring.length);
       &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;alert(myPet.offspring[0]);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;pre style="margin-left:0.49in;"&gt;&lt;code&gt;&lt;font size="2"&gt;//Trả về [Mammal &amp;quot;Baby Tom&amp;quot;]&amp;#39;&lt;/font&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Vấn
đề Super &amp;amp; Sub Class&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hãy
thử mở rộng ví dụ trên để ta có dịp
minh họa cách mà một class con gọi đến một
phương thức của class cha trong khi nó đã được
overridden. Ta sẽ muốn rằng ngay sau khi mèo con được
sinh ra nó sẽ kêu một tiếng &amp;quot;meeoo!&amp;quot;
chẳng hạn. Để làm được điều này ta sẽ
viết một hàm haveBaby của riêng class Cat trong đó
sẽ gọi lại hàm haveBaby trong class Mammal:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.haveABaby=function(){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.prototype.haveABaby.call(this);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;mew!&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ở
đây, các bạn hãy nhớ lại cách thức
sử dụng phương thức call của đối tượng Function mà
ta đã từng đề cập. Như vậy với việc sử dụng
call() ta hoàn toàn có thể làm được
giống như phương thức &amp;quot;super()&amp;quot; trong Java và
các ngôn ngữ khác.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do
vậy, từ bây giờ để cho tiện thì tại sao
chúng ta không cài đặt luôn một
&amp;quot;super&amp;quot; cho class của chúng ta. Làm điều
đó không mấy phiền hà như sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype=newMammal();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.constructor=Cat;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.parent=Mammal.prototype;&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;//&amp;quot;super&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.haveABaby=function(){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   &lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var
theKitten = this.parent.haveABaby.call(this);&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;quot;super(this)&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;mew!&amp;quot;);
  &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return
theKitten;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Các
bạn sẽ có thắc mắc nhỏ là tại sao không
dùng từ super thay cho parent? Lí do là vì
hình như JavaScript có ý định sài từ
này trong các phiên bản tương lai thì
phải! Một điều nữa nếu bạn băn khoăn là từ
parent đã được DOM sử dụng khi truy cập đến các
node, điều này thì cứ vô tư đi vì
đây là JavaScript mà!!!:D&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Vấn
đề virtual Class&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;
&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Một số ngôn ngữ
lập trình hướng đối tượng có giải quyêt
vấn đề về virtual class, tức là một class không
thể có một thể hiện của chính nó,
nhưng có thể kế thừa từ nó. Như trong ví
dụ trên, ta muốn thêm vào một class
LivingThing mà Mammal sẽ kế thừa từ nó, nhưng
ta không muốn ai đó lại có thể tạo ra
một LivingThing không mong muốn (chẳng hạn
LivingStone!!:P). Với JavaScript ta có thể thực hiện
điều này bằng cách thay thế function bằng một
object cho virtual class.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Khai báo
class kiểu JSON&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LivingThing={&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   &lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span style="font-style:normal;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; beBorn
: function(){       &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.alive=true; 
 &lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.prototype =
LivingThing;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.prototype.parent
= LivingThing;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Để ý
rằng không phải là &amp;#39;LivingThing.prototype&amp;#39;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.prototype.haveABaby=function(){ &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.parent.beBorn.call(this);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span style="font-style:normal;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var
newBaby=new this.constructor(&amp;quot;Baby &amp;quot;+this.name);&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span style="font-style:normal;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.offspring.push(newBaby);   &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return newBaby;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Như
vậy nếu một ai đó khai báo như sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
stone= new LivingThing(); // Sẽ gây lỗi&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bởi
vì LivingThing bây giờ không phải là
kiểu function mà có kiểu là object, do đó
không thể coi nó như là một constructor với
từ khóa new.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Như
các bạn đã thấy, với cách cài đặt
kế thừa trên ta luôn phải thực hiện hai dòng
lệnh bắt buộc mỗi khi thực hiện kế thừa. Để cho
tiện lợi, ta có thể mở rộng khả năng này
cho bản thân object Function trong JavaScript, và coi
đó như là một thuộc tính vốn có
của BLOCKED SCRIPT&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="left"&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function.prototype.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;b&gt;inheritsFrom=&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;function(parentClsOrObj){&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;  &lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if
(parentClsOrObj.constructor == Function ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Normal
Inheritance&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype = new parentClsOrObj;&lt;br /&gt;      
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype.constructor = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype.parent=parentClsOrObj.prototype;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p align="left"&gt;  &lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Pure Virtual Inheritance&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype = parentClsOrObj;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype.constructor
= this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.prototype.parent = parentClsOrObj;&lt;br /&gt;   &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LivingThing = {&lt;br /&gt;  
	&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; beBorn : function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.alive = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Mammal(name){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.offspring=[];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;b&gt;inheritsFrom&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;(
LivingThing );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mammal.prototype.haveABaby=function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.parent.beBorn.call(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var newBaby=new
this.constructor( &amp;quot;Baby &amp;quot;+this.name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.offspring.push(newBaby);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return newBaby;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Cat( name ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;b&gt;inheritsFrom(&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, sans-serif"&gt;&lt;font size="2"&gt;&lt;span&gt;
Mammal );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.haveABaby=function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var
theKitten = this.parent.haveABaby.call(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;mew!&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return theKitten;&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat.prototype.toString=function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;#39;[Cat &amp;quot;&amp;#39;+this.name+&amp;#39;&amp;quot;]&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tom = new Cat( &amp;quot;Tom&amp;quot; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var kitten =
tom.haveABaby( ); // mew!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert( kitten );                 //
[Cat &amp;quot;Baby Tom&amp;quot;]&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="left"&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ////////////////////////////////////////////////////////&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="left"&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Phù!!!Giá
như JavaScript hỗ trợ tốt OOP thì đỡ biết mấy!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://aptech.ac.vn/aggbug.aspx?PostID=1735" width="1" height="1"&gt;</content><author><name>tunn</name><uri>http://aptech.ac.vn/members/tunn.aspx</uri></author><category term="Lập tr&amp;#236;nh" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/L_AD1E_p+tr_26002300_236_3B00_nh/default.aspx" /><category term="JavaScript" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/JavaScript/default.aspx" /></entry><entry><title>JavaScript và lập trình hướng đối tượng - Phần 2</title><link rel="alternate" type="text/html" href="http://aptech.ac.vn/fpt/programming/2008/08/18/javascript-v-224-l-p-tr-236-nh-h-ng-i-t-ng-ph-n-2.aspx" /><id>http://aptech.ac.vn/fpt/programming/2008/08/18/javascript-v-224-l-p-tr-236-nh-h-ng-i-t-ng-ph-n-2.aspx</id><published>2008-08-18T07:09:00Z</published><updated>2008-08-18T07:09:00Z</updated><content type="html">&lt;p align="left"&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="5"&gt;&lt;b&gt;Class
và prototype&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="3"&gt;&lt;b&gt;1-
Xây dựng class trong JavaScript&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trong
lập trình hướng đối tượng, chúng ta thường
tạo những đối tượng từ các lớp (class), trong đó
các object được coi như là trường hợp cụ
thể của một lớp. Cả hai ngôn ngữ Java và
JavaScript đều cung cấp cho chúng ta từ khóa new
dùng để tạo  một thể hiện của một đối tượng
đã được định nghĩa trước đó.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trong
Java, mọi thứ đều là object, và được phát
triển từ class nguyên thủy là java.lang.Object.
Chắc hẳn nếu bạn là lập trình viên Java
hẳn sẽ thấy câu lệnh sau khá quen thuộc:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[quote] &amp;nbsp;&amp;nbsp; MyObject
myObj=new MyObject(arg1,arg2);&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[/quote]&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Với
JavaScript cũng có cách khai báo rất giống
như vậy:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[quote]&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp; var
myObj= new MyObject(arg1, arg2);&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[/quote]&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nhưng
có một sự khác biệt lớn về bản chất đó
là chúng ta hoàn toàn không định
nghĩa lớp MyObject như trong Java mà thay vào đó
là một hàm thật sự có cùng tên:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[quote]&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
MyObject(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //do
something here&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;[/quote]&lt;/font&gt;&lt;/font&gt; &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Để
minh họa cho điều này, ta xét ví dụ sau
khai báo một class Animal với các thuộc tính
đơn giản như name, food và phương thức đơn giản
là eat:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;








&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
Animal(name, food){&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Thuộc
tính&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;		//Tên
con vật, hoặc tên loài&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.food=food;		//Loại
thức ăn có thể ăn&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Phương
thức&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.eat=function(something){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(something===food){	//Nếu
thức ăn phù hợp&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;#39;This
is very delicious&amp;#39;);	&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;I
don&amp;#39;t like this&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myAnimal = new Animal(&amp;quot;Cat&amp;quot;,&amp;quot;Mouse&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myAnimal.eat(&amp;quot;Mouse&amp;quot;);//
This is very delicious&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Trong
ví dụ trên, một lần nữa ta sử dụng từ khóa
this, với cấu trúc trên thì ta có thể
hiểu this là đối tượng được tạo ra sau từ khóa
new.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tất
nhiên với cách khai báo như vậy mọi việc
đều OK, nhưng nếu đi sâu hơn một chút chúng
ta sẽ thấy: đầu tiên, cho mỗi thể hiện của class
Animal mà chúng ta tạo ra, chúng ta cũng tạo
ra một hàm eat() mới, điều này dẫn đến vấn
đề về bộ nhớ và tốc độ xử lý nếu bạn
có ý định tạo ra rất nhiều đối tượng
trong chương trình từ class Animal (ví dụ tạo
một đàn kiến chẳng hạn!!!); thứ nữa, khi làm
việc với các DOM (Document Object Model), chúng ta
sẽ gặp phải vô số vấn đề rắc rối không
mong đợi. Chính vì vậy bây giờ ta hãy
thử một cách khác an toàn hơn, và nó
được biết đến cái tên khá lạ tai:
prototype-base.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="3"&gt;&lt;b&gt;2-
Prototype&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Prototype
là gì vậy? Thực ra đây là một thuộc
tính sẵn có trong mọi object trong JavaScript
(trong JavaScrip thuộc tính cũng có thể là
một đối tượng, ta sẽ đề cập chi tiết hơn về điều
này sau), đây có thể coi là nét
đặc trưng của JavaScript mà các ngôn ngữ
hướng đối tượng khác không có. Các
hàm cũng như các thuộc tính đều có
thể kết hợp được với  prototype. Prototype và từ
khóa new có thể làm việc cùng nhau,
khi một đối tượng được tạo bởi từ khóa new
thì tất cả các thuộc tính và phương
thức prototype đều được gắn vào đối tượng mới
đó. Điều này nghe có vẻ lạ và rắc
rối, nhưng khá là hiệu quả:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ta
xây dựng lại class Animal theo phong cách prototype
như sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
Animal(name, food){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Thuộc
tính&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;		//Tên
con vật, hoặc tên loài&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.food=food;		//Loại
thức ăn có thể ăn&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animal.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;b&gt;prototype&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;.eat=function(something){&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;		&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(something===this.food){//Nếu
thức ăn phù hợp&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;#39;This
is very delicious&amp;#39;);	&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;I
don&amp;#39;t like this&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myAnimal = new Animal(&amp;quot;Cat&amp;quot;,&amp;quot;Mouse&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myAnimal.eat(&amp;quot;Mouse&amp;quot;);//
This is very delicious&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Như
vậy đầu tiên chúng ta vẫn khai báo class
với các thuộc tính bình thường, sau đó
đối với các phương thức ta chỉ việc gắn nó
vào prototype như trên. Khi chúng ta tạo một
thể hiện của class thì phương thức được gắn
vào object đó mà không phải tạo mới,
và từ khóa this sẽ đảm bảo rằng trường
food là của object vừa tạo.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Trong
việc thao tác với prototype, có một lưu ý
là mọi object được tạo ra sau prototype thì sẽ
được gắn các thuộc tính hoặc phương thức
được khai báo kiểu prototype trước đó, ví
dụ:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObject.prototype.color=&amp;quot;red&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myObj1=new myObject();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObject.prototype.color=&amp;quot;blue&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObject.prototype.sound=&amp;quot;boom!&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myObj2=new myObject();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj1.color);	//red&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj2.color);	//blue&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj2.sound);	//boom!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj1.sound);	//erro!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Khi
đó myObj1 chỉ có thuộc tính color với giá
trị là red, còn myObj2 có thêm thuộc
tính sound và giá trị color là blue.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Mở
rộng một object trong JavaScript&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp; Trên
thực tế, cơ chế prototype còn có thể áp
dụng cho các đối tượng xây dựng sẵn trong
JavaScript, ta có thể dùng nó để mở rộng
các đối tượng này. Một ví dụ rất hữu
ích là mở rộng đối tượng Array như sau:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.prototype.indexof=function(obj){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; var
result=-1;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(var
i=0;i&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(this[i]==obj){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return
i;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;	&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return
result;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
ary=new Array();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ary=[&amp;quot;one&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;three&amp;quot;];&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(ary.indexof(&amp;quot;one&amp;quot;))		//0&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ví
dụ trên, ta mở rộng Array bằng cách thêm
vào một phương thức indexof tính chỉ số của
một phần tử trong mảng, nếu đối tượng không có
trong mảng thì trả về giá trị là -1;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Microsoft Sans Serif, sans-serif"&gt;&lt;font size="3"&gt;&lt;b&gt;3-
Cơ chế của prototype&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Một
câu hỏi sẽ được đặt ra là cơ chế hoạt
động của prototype như thế nào? Tại sao với
prototype ta có thể giả lập khá nhiều các
đặc tính hướng đối tượng? Thật ra prototype lại
có một cơ chế hoạt động khá đơn giản: Mỗi
khi bạn thực hiện thao tác với thuộc tính và
phương thức của một đối tượng nào đó
trong JavaScript, thì trình thông dịch sẽ
thực hiện các bước tuần tự sau để xác
định thuộc tính hay phương thức nào được
thực thi:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;
	&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Nếu thuộc tính
	hay phương thức của đối tượng đang xét có
	giá trị hoặc đã được gán giá
	trị thì thuộc tính hay phương thức đó
	được sử dụng.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p&gt;
	&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;Nếu không thì
	kiểm tra giá trị của thuộc tính của
	prototype trong cấu trúc của object.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;Cứ
	tiếp tục như vậy cho đến khi tìm thấy thuộc
	tính phù hợp (thuộc tính đã được
	gán giá trị) hoặc giá trị tìm được
	là kiểu &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;Object&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chính
vì vậy bất cứ khi nào muốn thêm một
thuộc tính hay gắn thêm một phương thức mới
cho một object bất kỳ ta chỉ việc khai báo nó
như là thuộc tính của prototype.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Để
thấy rõ hơn điều này ta sẽ cùng nhau tìm
hiểu sâu hơn một chút về các thuộc tính
và phương thức của các đối tượng cài
đặt sẵn bên trong JavaScript là Object và
Function&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a)
Object:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thuộc
tính: 	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constructor&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prototype&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Phương
thưc: 	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hasOwnProperty()&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; isPrototypeOf()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; toString()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; valueOf()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; toLocaleString()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ở
đây chúng ta chỉ cần lưu ý phương thức
khá đặc biệt đó là hasOwnProperty();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Với
hasOwnProperty() sẽ trả về giá trị true nếu object
đang xét có thuộc tính nào đó
nhưng không phải là thuộc tính được khai
báo kiểu mở rộng prototype, ví dụ:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myObj=new Object();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObj.firstProperty=&amp;quot;xyz&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObj.prototype.secondProperty=&amp;quot;abc&amp;quot;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj.hasOwnProperty(&amp;quot;firstProperty&amp;quot;))	//true&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj.hasOwnProperty(&amp;quot;fdasffsdf&amp;quot;))	//false&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myObj.hasOwnProperty(&amp;quot;secondProperty&amp;quot;))	//false&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;


&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b)
Function&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thuộc
tính: 	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constructor&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prototype&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arguments&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arity&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; caller&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; length&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Phương
thức: 	&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; apply()&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; toString()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; valueOf()&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Với
đối tượng Function, chúng ta sẽ tìm hiểu kĩ
hơn một chút bởi lẽ đây là đối tượng
chính dùng trong lập trình OOP với
JavaScript.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thuộc
tính constructor&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
thuộc tính này trả về một constructor mà
từ đó object được tạo ra, ví dụ:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myFunc=new Function();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myFunc.constructor);
// kết quả sẽ là Function&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lưu
ý rằng thuộc tính này chỉ có trong
các biến có kiểu object, nên với một biến
bất kỳ muốn sử dụng constructor thì ta phải kiểm
tra kiểu trước khi sử dụng, ví dụ.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(typeof
myVar ==&amp;quot;object&amp;quot;){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(myVar.constructor);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thuộc
tính arguments&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
arguments thực chất là một mảng chứa các tham
số cho function, khi function được gán cho một đối
số thì đối số này sẽ được đẩy vào
mảng arguments, ta xét ví dụ sau:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
test(){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var
arg=test.arguments;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(var
i=0;i&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(arg[i]);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test(1,&amp;quot;a&amp;quot;);//
sẽ đưa ra giá trị 1 và sau đó là
&amp;quot;a&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Để
ý rằng hàm test ban đầu không khai báo
tham số, nhưng khi chạy ta đã thêm hai tham số
vào cho nó do vậy trong arguments sẽ có 2
giá trị.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Phương
thức call() và apply()&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&lt;span&gt;:
Đây là hai phương thức của object Function, dùng
để thực thi, hoặc gọi một  function. Tham số đầu của
hai phương thức trên thường là một object, cái
mà sẽ được coi là object hiện thời và
là tham số cho hàm thực thi phương thức call()
hay apply(). Trong thực tế người ta thường dùng call
thay cho apply bởi chức năng không có gì
khác nhau, chỉ khác ở tham số truyền vào
cho hai phương thức. Để minh họa điều này ta xét
ví dụ sau:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
showInfo(){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(this.name);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function
myObject(name){&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.name=name;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.show=showInfo;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var
myObj=new myObject(&amp;quot;AxitDN&amp;quot;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Cách
thông thường&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myObj.&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;show&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;();		//kết
quả cho AxitDN&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Sử
dụng call&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New, monospace"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; showInfo.call(myObj);	//kết
quả cho AxitDN&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Arial, sans-serif"&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ví
dụ trên cho ta thấy rằng trong JavaScript, các hàm
được sử dụng một cách khá tự do, thậm trí
được sử dụng với một mục đích hoàn toàn
khác so với lúc nó được tạo cho đến
khi kết thúc chương trình. Không những thế
với thuộc tính đặc biệt prototype càng làm
cho chương trình viết bằng JavaScript trở nên vô
cùng sinh động.&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;(Còn nữa)&amp;nbsp;&lt;/p&gt;&lt;div style="margin:0px;padding:0px;overflow:visible;position:absolute;left:165px;top:4728px;width:444px;height:352px;display:none;z-index:1000;font-size:12px;cursor:default;" id="OAK_VOC_DIV_ID"&gt;&lt;div style="border:medium none;margin:0px;overflow:hidden;width:100%;height:24px;" id="oakvoc-tip-title-div"&gt;&lt;/div&gt;&lt;div style="border:medium none;margin:0px;padding:0px;overflow:visible;width:100%;height:328px;" id="oakvoc-tip-content-div"&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://aptech.ac.vn/aggbug.aspx?PostID=1734" width="1" height="1"&gt;</content><author><name>tunn</name><uri>http://aptech.ac.vn/members/tunn.aspx</uri></author><category term="Lập tr&amp;#236;nh" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/L_AD1E_p+tr_26002300_236_3B00_nh/default.aspx" /><category term="JavaScript" scheme="http://aptech.ac.vn/fpt/programming/archive/tags/JavaScript/default.aspx" /></entry></feed>