2010-01-19 22 views
13

Có rất nhiều bài viết và bài viết giải thích cách hoạt động của kế thừa JavaScript, nhưng tại sao JavaScript được triển khai bằng cách sử dụng thừa kế nguyên mẫu thay vì thừa kế cổ điển?Tại sao JavaScript được triển khai bằng cách sử dụng thừa kế prototypal?

Tôi thích JavaScript, vì vậy tôi không nói điều xấu ... Tôi chỉ tò mò thôi.

+7

đánh dấu là wiki cộng đồng, vui lòng .. –

+0

Người tạo JavaScript có phải là người dùng Stackoverflow không? –

+1

@Gaby - Có câu trả lời ở đâu đó. – ChaosPandion

Trả lời

1

Tôi nghĩ rằng nó đã được chọn vì nó rất dễ thực hiện, không cần thêm từ khóa và người dùng không cần phải hiểu nó để có thể sử dụng ngôn ngữ. Nó cũng mạnh mẽ hơn và linh hoạt hơn so với thừa kế dựa trên lớp.

Đó là lựa chọn tự nhiên cho ngôn ngữ không được nhập. Ưu điểm chính của kế thừa dựa trên lớp là nó cho phép gõ tĩnh và do đó kiểm tra kiểu và thực hiện tra cứu dựa trên bảng nhanh hơn.

+0

Tôi tự hỏi về đối số "dễ thực hiện". Mặc dù điều này có thể đúng đối với thừa kế đối tượng, nhưng dường như không đúng khi bạn xem xét rằng các hàm lớp đầu tiên của JavaScript thực sự mạnh mẽ, và tôi tin tưởng, không đơn giản để thực hiện ở tất cả (một phần ứng dụng, bao đóng, v.v.) – stakx

12

Trừ khi một trong những nhà thiết kế JavaScript dừng lại để cân nhắc, chúng tôi chỉ có thể suy đoán. Điều đó đã được nói, đây là lựa chọn của tôi:

JavaScript được thực thi khi nó được diễn giải, vì vậy không có khái niệm tách riêng việc khai báo loại đối tượng khỏi chính đối tượng đó. Đó là một cách tiếp cận rất chức năng. Ví dụ này đang tồn tại khi nó đang được mô tả - chúng tôi luôn hoạt động trên các phiên bản hoạt động. Bởi vì điều này, khái niệm về một lớp - hoặc một "mẫu cá thể" thụ động - không có vị trí thực.

+4

Có rất nhiều ngôn ngữ kịch bản sử dụng các lớp. –

+0

Điều này có nhiều chất như nói rằng nó là nguyên mẫu vì nó là nguyên mẫu. Không phải là bạn đang nói điều đó, nhưng kết luận là vô nghĩa. –

+0

@SeanMcMillan đúng, nó không phải là ý định của tôi để ngụ ý ngôn ngữ * phải * làm việc theo cách này bởi vì nó là một ngôn ngữ kịch bản, thay vì nó khá thuận tiện. –

8

JavaScript ban đầu được cho là rất giống Lisp. Ngay cả sau khi cú pháp đã được thay đổi để gần giống với C/Java, nó vẫn là Lisp in C's clothing. Tôi nghĩ câu trả lời nằm ở nguồn gốc lập trình chức năng của nó. Trong FP thuần túy, không có trạng thái có thể thay đổi, có nghĩa là không có đối tượng có thể thay đổi được. Nếu bạn thư giãn các quy tắc một chút và nhận được một chút sáng tạo, bạn kết thúc với một cái gì đó giống như kế thừa protypal, tức là, bạn có thể mở rộng các đối tượng nhưng không sửa đổi các đối tượng ban đầu. Nó cung cấp sức mạnh tương tự như thừa kế và vẫn mang lại cho bạn một số bất biến.

Cuối cùng, xoay ngôn ngữ xung quanh để làm cho nó trông giống như C++ và Java, và viola, bạn có new someFunction() và phần còn lại là lịch sử.

+1

Bạn có ý nghĩa gì bởi "không có trạng thái có thể thay đổi, có nghĩa là không có đối tượng có thể thay đổi"? –

+0

@Andre: Trong ** thuần túy ** lập trình chức năng (như Erlang ví dụ) tất cả các biến là hằng số. Các giá trị mà chúng giữ không thể được sửa đổi sau khi biến được khởi tạo. Vì chúng ta đề cập đến các đối tượng sử dụng các biến có nghĩa là các đối tượng trong FP thuần túy không thể được sửa đổi: tất cả các đối tượng là các hằng số. – slebetman

+0

Được rồi, nhưng trong javascript, nếu tôi làm điều này: var a = {name = "n", age = 1}. a.age = 2. Tôi đang làm gì? tái instantiating 'a'? –

1

Thừa kế nguyên mẫu (có đóng cửa) cho phép người khác làm những việc chưa bao giờ được hình dung. Đó là sự chia lưới của một số mô hình đã đến với nhau để đạt được lập trình mục đích chung.

Với ngôn ngữ mẫu, bạn có thể có "kết hợp" cho lớp học của mình. Bạn có thể hoàn thành cấp độ đóng gói mà bạn mong muốn, không có từ khóa cụ thể về ngôn ngữ. Tóm lại, các ngôn ngữ nguyên mẫu là tuyệt vời.

Tôi ghét phải nói điều đó, nhưng JavaScript, cộng với một số thư viện, có thể làm mọi thứ tôi cần. Nó đã được lật đổ trong sự phát triển của nó (nghĩa vụ phải được dành cho Java). Nó có nhiều quyền lực, trong việc triển khai đơn giản nhất.

Với đủ nghiên cứu/chơi xung quanh, bạn sẽ bắt đầu thấy những lợi thế của nguồn cảm hứng của nó. JavaScript là một trong số ít ngôn ngữ "ẩn" tiềm năng có chủ ý. Bạn phải tham gia vào chính trị nếu bạn muốn biết "tại sao". Nhưng, vì lý do này, nó thật tuyệt vời.

+0

@Pestilence, bạn có thể chỉ cho tôi một số tài nguyên để "làm những điều chưa bao giờ được hình dung" không? Ví dụ với mix-in, tôi có thể lấy các phương thức từ một đối tượng bằng cách thiết lập nguyên mẫu của tôi cho nó, nhưng tôi chỉ có thể làm điều này một lần, đúng không? Trừ khi tôi làm điều gì đó mà không cần các nguyên mẫu như: - Tôi có một đối tượng X, tôi muốn nó có Y.doSomething - X.doSomething = Y.doSomething - (chỉ cần đặt tham chiếu đến Y.doSomething, Điều gì nếu tôi muốn nó có một cách độc lập) – ambertch

+0

Vâng, thi đua thừa kế lớp là một điều bạn có thể làm ... Nhưng, bạn thực sự không cần phải lo lắng về cấu trúc phân cấp trong một ngôn ngữ động được gõ. Đơn giản chỉ cần sao chép một hoặc nhiều nguyên mẫu của bạn vào một thể hiện mới. Những việc bạn có thể làm, bao gồm: Xây dựng động "các lớp" và các trường hợp bằng cách trộn các phương thức và trình khởi tạo từ "các lớp" khác. Lập trình thay đổi giao diện trong quá trình "xây dựng". Thậm chí thay đổi "các lớp" cơ sở. Sửa đổi tất cả các đối tượng chuỗi để bao gồm các phương thức Base64 là một cái gì đó tôi muốn làm: "foo" .base64(). – pestilence669

+0

Thuộc tính prototype mà bạn đang đề cập đến, có thể được coi là tùy chọn, cho các lớp tùy chỉnh. Bạn có thể kiểm soát và bỏ qua nó hoàn toàn. – pestilence669

5

Bởi vì nó chịu ảnh hưởng nặng nề của bản thân. Cả Wikipedia và ECMA-spec đều đề cập đến điều này.

15

Đây là những gì Brendan Eich đã nói về những gì đã xảy ra: http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html

Như tôi đã thường nói, và như những người khác tại Netscape có thể khẳng định, tôi đã được tuyển dụng vào Netscape với lời hứa "làm Scheme "trong trình duyệt. Ít nhất quản lý kỹ thuật khách hàng bao gồm Tom Paquin, Michael Toy, và Rick Schell, cùng với một người tên là Marc Andreessen, đã tin rằng Netscape nên nhúng một ngôn ngữ lập trình, dưới dạng mã nguồn, trong HTML.

Diktat từ quản lý kỹ thuật cấp cao là ngôn ngữ phải "giống như Java". Điều đó loại trừ Perl, Python và Tcl, cùng với Đề án.

Tôi không tự hào, nhưng tôi hạnh phúc vì tôi đã chọn các hàm lớp đầu tiên của Scheme-ish và nguyên mẫu Self-ish (mặc dù số ít) là thành phần chính. Ảnh hưởng của Java, đặc biệt là các lỗi ngày tháng năm y2k mà ​​còn là sự phân biệt nguyên thủy so với đối tượng (ví dụ, chuỗi so với String), không may.

Các vấn đề liên quan