Tôi có được các khái niệm cơ bản về Mô hình Mô-đun và việc sử dụng dấu đóng để cho phép thành viên riêng tư, NHƯNG tôi không thể nuốt được vì sao mã bên dưới làm như vậy:Mô hình Mô-đun Javascript và từ khoá mới
var Calculator = function() {
var priv = 0;
return {
changePriv: function() { priv++;},
printPriv: function() { console.log(priv);}
}
}
var myCalc = Calculator();
myCalc.printPriv();
myCalc.changePriv();
myCalc.printPriv();
var myOtherCalc = Calculator();
myCalc.printPriv();
Giao diện điều khiển đầu ra là
0
1
1
Vì vậy, cố tình bỏ qua new
từ khóa ở đây, cuộc gọi đầu tiên đặt myCalc
đến một đối tượng Calculator. Nó bắt đầu với một giá trị từ 0 priv
, đã có tăng lên, và sau đó in ra giá trị mới priv
của 1.
Nhưng a) Tại sao cuộc gọi tiếp theo để Calculator()
kết thúc trở về một tham chiếu đến cùng một đối tượng (như được chứng minh bằng '1' thứ hai)? Tôi biết tôi có thể sử dụng new
ở đây và tránh điều đó, nhưng không hiểu tại sao tôi phải làm vậy. Không phải chức năng này sử dụng cú pháp ngữ pháp đối tượng để tạo ra một đối tượng mới và sau đó trả về nó? b) Vì nó dường như đang sử dụng cùng một không gian ngăn xếp chức năng (là ngay cả cách đúng đắn để suy nghĩ về nó trong JS?), Tại sao nó không ra biến số priv
trong quá trình trước khi trả về tham chiếu đến cùng một đối tượng?
CHỈNH SỬA: Sửa lỗi không chính xác/ngu ngốc (nhờ scessor), DOES bây giờ xuất ra đối tượng máy tính mới/khác biệt ngay cả khi không sử dụng từ khóa new
. Vì vậy, xóa a) và b). Câu hỏi kết quả của tôi sẽ là "Liệu nó có quan trọng cho dù tôi sử dụng new
hay không trong lời kêu gọi của một nhà xây dựng mô-đun mẫu. Câu trả lời là, tôi đoán nó không quan trọng (?). (Joseph: xem http://jsfiddle.net/MvMvy/5/ ... nhà điều hành instanceof chỉ đơn giản là không làm việc với kiểu mô-đun hoặc chiều)
Theo quy ước, các hàm bắt đầu bằng một chữ hoa được dành riêng cho các hàm tạo (tức là các hàm được cho là được gọi với 'mới'). Hàm 'Calculator' trả về một đối tượng một cách rõ ràng để gọi nó bằng' new' không tạo ra bất kỳ sự khác biệt nào với nó trả về. – RobG
Cảm ơn RobG. Đó là chính xác những gì tôi đã hy vọng để có được xác nhận trên. – jeffersii