Ví dụ thứ hai chỉ định nghĩa một thể hiện của Object
, với một vài thuộc tính được đặt. Cái đầu tiên thú vị hơn nhiều.
Chức năng trong JavaScript có mục đích kép, một hàm làm chức năng/thủ tục bình thường và phương thức kia làm cơ sở cho kế thừa prototypal, tương tự như "lớp" trong OOP bình thường.
Ví dụ:
var apple = function() {
this.type = 'granny smith';
};
var myApple = new apple();
alert(myApple.type); // -> 'granny smith'
Ở đây, chúng tôi đã xác định một "lớp" gọi apple
, với một initializer mà đặt type
tài sản. myApple
sau đó được tạo dưới dạng phiên bản apple
và thuộc tính type
được thiết lập bởi trình khởi tạo apple()
.
(Là một sang một bên, new apple()
cũng có thể được gọi là new apple
với ngoặc bỏ qua và kết quả là vẫn như nhau, initializer vẫn gọi, nó chỉ nhận không có đối số)
Điều quan trọng khác sử dụng new
cho chúng ta là sự thừa kế nguyên mẫu. Tất cả các chức năng đi kèm với một đối tượng nguyên mẫu mà chúng ta có thể thiết lập các thuộc tính. Các thuộc tính này sau đó trở thành các giá trị dự phòng cho các đối tượng mẫu không có giá trị riêng của chúng được xác định.
Ví dụ:
var greenApple = function() { };
var myApple = new apple();
alert(myApple.color); // -> undefined
greenApple.prototype.color = 'green'
alert(myApple.color); // -> green
Ở đây, thiết greenApple.prototype.color
ảnh hưởng đến tài sản màu cho myApple
chúng tôi đã tạo ra. Đây là những gì được gọi là thừa kế prototypal, và nó có nhiều cách sử dụng.
Edit:Sau đây đề cập đến một phiên bản trước của câu hỏi đó đã được chỉnh sửa trong khi tôi đang viết những dòng này. Bạn có thể bỏ qua nó một cách an toàn trừ khi bạn đặc biệt quan tâm.
Bây giờ, trở lại ví dụ đầu tiên của bạn:
var apple = new function() { ... }
Bởi vì bạn có từ khóa new
trước khi định nghĩa hàm, hiệu quả là như tạo lớp táo, làm cho một đối tượng myApple, sau đó ném lớp táo xa. Nếu bạn có quyền truy cập vào lớp này, bạn có thể sử dụng .prototype
để thêm thuộc tính nguyên mẫu, nhưng bạn không - tất cả được chứa trong biến số apple
(trong điều khoản OOP) là một thể hiện của lớp, chứ không phải chính lớp đó.
Không, nó không phải là JSON cú pháp, nó là một đối tượng chữ. JSON là một định dạng văn bản là một tập con của cú pháp ngữ pháp đối tượng Javascript. – Guffa
json cũng không hỗ trợ chức năng –