Javascript là một ngôn ngữ hướng đối tượng

Tôi biết, chủ đề này đã được thảo luận rất nhiều lần, quá nhiều lần. Tuy nhiên nó luôn là chủ đề thời sự. Mỗi khi một nhà phát triển ngôn ngữ Java hoặc C# hoặc bất kỳ ngôn ngữ OOP nào khác tiếp xúc với JavaScript, anh ấy đều phàn nàn về điều đó. Anh ấy nói rằng làm việc với nó là một mớ hỗn độn, nó không có kiểu, không có cấu trúc tốt, nó có một số điểm kỳ lạ, hỗ trợ đối tượng của nó rất tầm thường và chắc chắn nó không phải là ngôn ngữ OOP

Một số khiếu nại này có thể được chấp nhận, nhưng một số khiếu nại khác là định kiến, chẳng hạn như khiếu nại rằng JavaScript không có loại và nó không phải là ngôn ngữ OOP. Về điểm sau, trước khi khẳng định, bạn nên tự hỏi mình. điều gì làm cho ngôn ngữ lập trình trở thành ngôn ngữ lập trình hướng đối tượng?

OOP là gì?

Mô hình OOP không dựa trên đặc tả tiêu chuẩn chính thức. Không có tài liệu kỹ thuật nào định nghĩa OOP là gì và không phải là gì. Định nghĩa OOP chủ yếu dựa trên ý nghĩa thông thường được lấy từ các bài báo được xuất bản bởi các nhà nghiên cứu ban đầu như Kristen Nygaard, Alan Kays, William Cook và những người khác. Đã có nhiều nỗ lực để định nghĩa OOP và một định nghĩa được chấp nhận rộng rãi để phân loại ngôn ngữ lập trình là Đối tượng
Hướng đến dựa trên hai yêu cầu.

  • khả năng của nó để mô hình hóa một vấn đề thông qua các đối tượng
  • nó hỗ trợ một số nguyên tắc cho phép tái sử dụng mô-đun và mã

Để đáp ứng yêu cầu đầu tiên, một ngôn ngữ phải cho phép nhà phát triển mô tả thực tế bằng cách sử dụng các đối tượng và xác định mối quan hệ giữa các đối tượng, chẳng hạn như sau

  • Sự kết hợp. Đây là khả năng của đối tượng để tham chiếu một đối tượng độc lập khác
  • tổng hợp. Đây là khả năng nhúng một hoặc nhiều đối tượng độc lập của đối tượng
  • Thành phần. Đây là khả năng của đối tượng để nhúng một hoặc nhiều đối tượng phụ thuộc

Thông thường, yêu cầu thứ hai được đáp ứng nếu một ngôn ngữ hỗ trợ các nguyên tắc sau

  • đóng gói. Đây là khả năng tập trung vào một dữ liệu thực thể duy nhất và mã thao tác nó, ẩn các chi tiết bên trong của nó
  • Di sản. Đây là cơ chế mà một đối tượng có được một số hoặc tất cả các tính năng từ một hoặc nhiều đối tượng khác
  • đa hình. Đây là khả năng xử lý các đối tượng khác nhau dựa trên kiểu dữ liệu hoặc cấu trúc của chúng

Đáp ứng các yêu cầu này là điều thường cho phép chúng tôi phân loại một ngôn ngữ là Hướng đối tượng

JavaScript và OOP

Vì vậy, bây giờ chúng ta biết một ngôn ngữ OOP sẽ trông như thế nào. Chúng tôi có thể chứng minh rằng JavaScript là ngôn ngữ OOP không?

Cho thấy rằng các đối tượng JavaScript hỗ trợ Hiệp hội, Tổng hợp và Thành phần là tầm thường. Hãy xem xét đoạn mã sau

Ở đây chúng tôi có một ví dụ về cách ba mối quan hệ cơ bản có thể được triển khai trong JavaScript

Về Đóng gói, các đối tượng JavaScript là các thực thể hỗ trợ dữ liệu và chức năng, nhưng chúng không có hỗ trợ riêng nâng cao để ẩn các chi tiết bên trong. Các đối tượng JavaScript không quan tâm đến quyền riêng tư. Tất cả các thuộc tính và phương thức đều có thể truy cập công khai nếu không thận trọng. Tuy nhiên, chúng ta có thể áp dụng một số kỹ thuật để xác định trạng thái bên trong của đối tượng và bảo vệ nó khỏi sự truy cập từ bên ngoài. từ việc sử dụng getters và setters để khai thác các bao đóng

Kế thừa được JavaScript hỗ trợ ở cấp độ cơ bản thông qua cái gọi là Kế thừa nguyên mẫu. Ngay cả khi một số nhà phát triển có thể coi nó hơi thô sơ, thì cơ chế kế thừa JavaScript hoàn toàn hiệu quả và cho phép đạt được kết quả tương tự như các ngôn ngữ OOP được công nhận rộng rãi. Dù bạn nói gì đi nữa, JavaScript có một cơ chế “theo đó một đối tượng có được một số hoặc tất cả các tính năng từ một hoặc nhiều đối tượng khác”, và đây là sự kế thừa

Với Đa hình, thử thách có vẻ khó hơn, vì nhiều người liên kết khái niệm này với các kiểu dữ liệu. Trên thực tế, tính đa hình liên quan đến nhiều khía cạnh của ngôn ngữ lập trình và nó không chỉ liên quan đến ngôn ngữ OOP. Thông thường, nó liên quan đến các mục như thuốc generic, quá tải và phân loại cấu trúc. Tất cả những điều này dường như là quá nhiều đối với một ngôn ngữ gõ “đơn giản” và yếu ớt như JavaScript. Đây không phải là sự thật. trong JavaScript, chúng ta có thể triển khai các loại đa hình khác nhau theo nhiều cách và có thể chúng ta đã vô tình làm điều đó nhiều lần

OOP không có lớp học

“OK, nhưng JavaScript không có lớp học. ” Nhiều nhà phát triển không coi JavaScript là ngôn ngữ hướng đối tượng thực sự do nó thiếu khái niệm lớp và vì nó không bắt buộc tuân thủ các nguyên tắc OOP.
Tuy nhiên, chúng ta có thể thấy rằng định nghĩa không chính thức của chúng ta không tham chiếu rõ ràng đến các lớp. Các tính năng và nguyên tắc được yêu cầu cho các đối tượng. Các lớp không phải là một yêu cầu thực sự, nhưng đôi khi chúng là một cách thuận tiện để trừu tượng hóa các tập đối tượng có thuộc tính chung. Vì vậy, một ngôn ngữ có thể là Hướng đối tượng nếu nó hỗ trợ các đối tượng ngay cả khi không có lớp, như trong JavaScript.
Hơn nữa, các nguyên tắc OOP cần thiết cho một ngôn ngữ nhằm mục đích hỗ trợ. Chúng không bắt buộc phải lập trình bằng ngôn ngữ. Nhà phát triển có thể chọn sử dụng các cấu trúc cho phép anh ta tạo mã Hướng đối tượng hoặc không. Nhiều người chỉ trích JavaScript vì các nhà phát triển có thể viết mã vi phạm nguyên tắc OOP. Nhưng đây chỉ là lựa chọn của lập trình viên, không phải là ràng buộc ngôn ngữ. Nó cũng xảy ra với các ngôn ngữ lập trình khác, chẳng hạn như C++.
Chúng ta có thể kết luận rằng việc thiếu các lớp trừu tượng và để nhà phát triển tự do sử dụng hoặc không có các tính năng hỗ trợ nguyên tắc OOP không phải là trở ngại thực sự để coi JavaScript là ngôn ngữ OOP.

Andrea Chiarelli là tác giả của Mastering JavaScript Object Oriented Programming (Packt Publishing)

Là đối tượng JavaScript

JavaScript nặng hướng đối tượng . Nó tuân theo một mô hình dựa trên nguyên mẫu, nhưng nó cũng cung cấp một cú pháp lớp để kích hoạt các mô hình OOP điển hình.

Tại sao JavaScript không phải là ngôn ngữ OOP?

Tại sao? . Một ngôn ngữ lập trình OO phải có đối tượng, phương thức, thuộc tính, lớp, đóng gói, tập hợp, kế thừa và đa hình . Bạn có thể triển khai tất cả các điểm này, nhưng JavaScript thì không.