Nó không phải là thiết lập cho một trò đùa, tôi thực sự yêu cầu.Chuỗi Javascript không phải là đối tượng?
Douglas Crockford is fond of saying rằng trong ngôn ngữ hướng đối tượng prototypal javascript không cần new
.
Ông giải thích rằng new
được chỉ đơn giản là thêm vào để cung cấp cho những người đến từ (ví dụ: " cổ điển") hướng đối tượng ngôn ngữ lập trình dựa trên lớp một số mức độ thoải mái:
JavaScript, We Hardly
new
YaJavaScript là một ngôn ngữ nguyên mẫu, nhưng nó có một toán tử
new
cố gắng làm cho nó trông giống như một ngôn ngữ cổ điển. Điều đó có xu hướng gây nhầm lẫn cho các lập trình viên, dẫn đến một số mẫu lập trình có vấn đề.Bạn không bao giờ cần sử dụng
new Object()
bằng JavaScript. Sử dụng đối tượng theo nghĩa đen{}
để thay thế.
Được rồi, tiền phạt:
new
xấu{}
tốt
Nhưng sau đó commenter Vítor De Araújo pointed out that the two are not the same. Ông đưa ra một ví dụ cho thấy rằng một string
không giống như một object
:
Một đối tượng chuỗi và một giá trị chuỗi không phải là điều tương tự:
js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
Giá trị chuỗi không thể có đặc tính mới. Điều tương tự cũng hợp lệ đối với các loại khác.
Điều gì đang xảy ra ở đây là string
không phải là object
? Tôi có hiểu nhầm javascript với một số ngôn ngữ khác, nơi mọi thứ đều là một đối tượng không?
... và tôi không hoàn toàn đồng ý với Crockford: nó không phải cần thiết để sử dụng 'new Object' (không phải là' new Array', sử dụng '[]' thay thế), nhưng nếu bạn muốn định nghĩa một thể hiện mới của một lớp được định nghĩa trước, bạn thực sự nên sử dụng toán tử 'new', như trong 'new Date()' hoặc 'new SchrodingersCat()'. –
@Marcel Korpel: * "nên sử dụng" *, hoặc ** phải ** * sử dụng *? Có cách nào khác để xây dựng một đối tượng mới từ nguyên mẫu đối tượng 'Date' không? –
Câu hỏi hay, trong trường hợp 'Ngày': ** phải **. Nếu bạn gọi 'Date' là một hàm rỗng, nó trả về ngày tháng và thời gian hiện tại dưới dạng một chuỗi. Ngoài ra, hãy xem [Sử dụng hàm tạo không có toán tử 'mới'] (http://stackoverflow.com/questions/1928342/using-constructor-without-operator-new) và [Toán tử mới của Javascript có làm gì ngoài việc làm cho cuộc sống khó khăn không?] (Http : //stackoverflow.com/questions/1744426/does-javascripts-new-operator-do-anything-but-make-life-difficult) –