NỘI DUNG: + Invoking Methods + Constructing Objects + Strings 1. Invoking Methods Nếu có đoạn mã Java sau: engine.put(stage, stage); thì đoạn mã JavaScript có thể gọi stage.setTitle(Hello); Trong thực tế, bạn cũng có thể sử dụng cú pháp stage.title = Hello; Nashorn hỗ trợ cú pháp thuận tiện cho các hàm getters và setters. Nếu stage.title xuất hiện bên trái toán tử ‘=‘ tương đương setTitle xuất hiện bên phải toán tử ‘=‘ tương đương getTitle
Trang 1CHƯƠNG 7 THE NASHORN
JAVASCRIPT ENGINE
Sinh viên : Phạm Tiến Dũng MSSV :20130694
Lớp : CNTT2.03 – K58
Trường Đại học Bách Khoa Hà Nội Viện Công nghệ thông tin & Truyền thông
-IT4784 – LẬP TRÌNH JAVA
Trang 2NỘI DUNG
NỘI DUNG
III.Bài tập
Trang 3I MÔ TẢ YÊU CẦU
I MÔ TẢ YÊU CẦU
1 Làm báo cáo
2 Trình bày slide lý thuyết chương 7 (7.3-7.5)
3 Tự đặt ra 3 câu hỏi trắc nghiệm liên quan đến
phần mình làm
Trang 4NỘI DUNG
NỘI DUNG
1 Invoking Methods
2 Constructing Objects
3 Strings
Trang 51 Invoking Methods
1 Invoking Methods
-Nếu có đoạn mã Java sau:
engine.put("stage", stage);
thì đoạn mã JavaScript có thể gọi
stage.setTitle('Hello');
-Trong thực tế, bạn cũng có thể sử dụng cú pháp
stage.title = 'Hello';
-Nashorn hỗ trợ cú pháp thuận tiện cho các hàm getters và setters -Nếu stage.title xuất hiện bên trái toán tử ‘=‘ tương đương setTitle
xuất hiện bên phải toán tử ‘=‘ tương đương
getTitle
Trang 61 Invoking Methods
1 Invoking Methods
Quan sát ví dụ sau:
Trang 7
1 Invoking Methods
1 Invoking Methods
-JavaScript không có khái niệm về nạp chồng phương thức -Nashorn cố gắng chọn phương thức Java phù hợp, dựa
theo số lượng và kiểu của các tham số.
Trang 82 Constructing Objects
2 Constructing Objects
-Khi bạn muốn khởi tạo các đối tượng trong JavaScript
Có hai cơ chế.
Cách 1:Sử dụng biến toàn cục Packages
var URL = java.net.URL ; // 1 đối tượng lớp java
Cách 2:Sử dụng phương thức Java.type
-Để khởi tạo một đối tượng ,ta sử dụng toán tử new
var url = new URL('http://horstmann.com');
Trang 92 Constructing Objects
2 Constructing Objects
-Cách 2 giúp xử lý lỗi tốt hơn nhưng cú pháp phức tạp
Ví dụ:
var url = new (Java.type ('java.net.URL'))
-Nếu bạn sử dụng Java.type với toán tử new, bạn cần thêm một bộ dấu ngoặc đơn
Trang 102 Constructing Objects
2 Constructing Objects
-Để imports inner class ta dùng
var entry = new java.util.AbstractMap.SimpleEntry('hello', 42);
-Nếu bạn sử dụng Java.type thì sử dụng ký tự $:
var entry = new (Java.type ('java.util.AbstractMap$SimpleEntry'))('hello', 42);
Trang 113 Strings
3 Strings
-Strings trong Nashorn là một đối tượng JavaScript
Ví dụ, hãy xem xét lệnh sau
-Ở đây, chúng ta gọi phương thức JavaScript slice Không có phương pháp như vậy trong Java
-Nhưng gọi
'Hello'.compareTo (' thế giới ')
cũng làm việc, mặc dù trong JavaScript không có phương thức
compareTo (Bạn chỉ cần sử dụng các toán tử <)
-Trong trường hợp này, các chuỗi JavaScript được chuyển thành các
Trang 123 Strings
3 Strings
-Việc chuyển đổi xảy ra tương tự với giá trị Numbers và
Boolean.
Ví dụ.
'Hello'.slice (' - 2 ') là hoàn toàn hợp lệ Chuỗi '-2' âm thầm chuyển đổi sang số -2
Trang 13BÀI TẬP
BÀI TẬP
Câu 1:Cho câu lệnh JavaScript sau:
stage.setTitle('Hello');
Tìm câu lệnh tương đương(thực hiện cùng chức năng,có cùng kết quả đầu ra mà không báo lỗi):
A. stage[title] = 'Hello';
B. stage.title('Hello');
C. stage.title = 'Hello' ;
D. stage.('title') = 'Hello';
Đáp án đúng: C
Giải thích: A,B,D là sai cú pháp
C do stage.title nằm bên trái dấu = nên tương đương với phương thức setTitle
Trang 14BÀI TẬP
BÀI TẬP
Câu 2: Cho đoạn lệnh Java sau:
Kết quả đầu ra là
A. 2Hello,hoang2
B. 2helloHello,hoang
2helloHello,hoang2
Trang 15BÀI TẬP
BÀI TẬP
Giải thích
thức được đinh nghĩa cuối cùng, danh sách đối số trong JavaScipt sẽ được truyền vào 1 mảng và được gán lần lượt cho các tham số của phương thức được gọi vì vậy khi gọi : funcA(\"2\", \"hello\") sẽ gọi
phương thức function funcA(c) và không báo lỗi thừa đối số
Vậy print(funcA(\"2\", \"hello\")) sẽ in ra 2
sẽ gọi phương thức getMessage(String a) , đối số là 2 nhưng không báo lỗi vì trong Nashorn sẽ tự chuyển đổi 2 thành 1 String
Trang 16BÀI TẬP
BÀI TẬP
Câu 3: Tìm câu lệnh không tương đương( không thực hiện cùng chức năng,không cùng kết quả đầu ra hoặc báo lỗi)
var Entry = Java.type('java.util.AbstractMap$SimpleEntry');
var entry=new Entry(‘hello’,42);
A.var entry = new java.util.AbstractMap.SimpleEntry('hello', 42);
B.var entry = new java.util.AbstractMap$SimpleEntry('hello', 42);
C.var Entry = new Java.type('java.util.AbstractMap$SimpleEntry')(‘hello’,42);
D.var Entry = java.util.AbstractMap$SimpleEntry;
var entry=new Entry(‘hello’,42);
Đáp án đúng là C
Giải thích:
A,B là sử dụng đối tượng Packages nên trước tên inner class có thể là dấu chấm hoặc $
C sử dụng phương thức Java.type nên cần thêm cặp dấu ngoặc tròn () sửa lại như sau:
var Entry = new (Java.type('java.util.AbstractMap$SimpleEntry'))(‘hello’,42);
Trang 17Cảm ơn thầy giáo và các bạn!