2016-07-14 17 views
5

Trong khi đọc "Object-Oriented JavaScript" trên trang web của Mozilla, tôi stumbled khi ghi chú này:Trong javascript, sự khác nhau giữa một đối tượng và một không gian tên là gì?

Điều quan trọng cần lưu ý là trong JavaScript không có sự khác biệt ngôn ngữ cấp giữa các đối tượng và không gian tên thông thường.

Tuy nhiên, lưu ý không rõ ràng về ý nghĩa của "sự khác biệt cấp ngôn ngữ".

Có nghĩa là có hai cách viết cùng một thứ? Hoặc có hai thuật ngữ đề cập đến cùng một điều?

+1

Làm thế nào để bạn xác định "không gian tên"? – nnnnnn

+4

Thật đơn giản: Không có không gian tên trong JavaScript. – Bergi

+1

Không có "không gian tên" trong javascript. Các đối tượng với các thuộc tính được sử dụng để tránh rất nhiều biến trong một phạm vi cụ thể, thường là phạm vi toàn cục. Đây là (không chính xác) được gọi là "không gian tên" vì chúng hoạt động giống như không gian tên. – RobG

Trả lời

5

Một số ngôn ngữ có một không gian tên thực tế không giống với một đối tượng. JavaScript không phải là một trong những ngôn ngữ đó, vì vậy các đối tượng được sử dụng cho mục đích này.

Ví dụ: các chức năng Math như Math.roundMath.abs, tất cả đều được đặt tên trong đối tượng Math. Họ không thực sự là phương pháp theo ngữ cảnh như toString là (ít nhất là trong bất kỳ thực hiện tôi đã tìm thấy), chỉ cần thu thập theo một đối tượng để giữ cho nó có tổ chức. *


* Họ là kỹ thuật phương pháp, bởi vì họ có thể truy cập bằng một tài sản trên một đối tượng (một định nghĩa rằng về mặt kỹ thuật làm cho tất cả phương pháp chức năng toàn cầu bởi vì họ có sẵn thông qua các đối tượng toàn cầu (ví dụ. window.Function())), nhưng không giống như các phương thức như toString hoặc phương pháp của hầu hết các triển khai console như console.log chúng không phụ thuộc vào đối tượng mà chúng được gọi và giá trị this không liên quan. Đối tượng Math được sử dụng hoàn toàn cho không gian tên, không phải vì ngữ cảnh mà nó cung cấp.

+0

"Không thực sự là các phương thức như * toString *". Một phương thức ECMAScript là [* một thuộc tính đối tượng tham chiếu đến một hàm *] (http://www.ecma-international.org/ecma-262/6.0/#sec-method), vì vậy * Math.abs * là một phương thức theo để các đặc điểm kỹ thuật. Sự khác biệt giữa * Math * và các đối tượng dựng sẵn khác như * Object * và * Function * là nó không phải là một hàm tạo (tức là nó chỉ là một đối tượng, không phải là một hàm). – RobG

+0

@RobG Đúng vậy, nhưng cùng một định nghĩa đó làm cho tất cả các phương thức hàm toàn cầu vì 'window.Function'. Tôi đã thêm một số ghi chú khác để làm rõ điểm đó. –

+0

Vâng, chính xác. Các hàm toàn cục là các phương thức của đối tượng chung theo cách mà * keys * là một phương thức của * Object * và * fromCharCode * là một phương thức của * String *, không phụ thuộc vào việc được gọi là phương thức của các đối tượng cơ sở của chúng. ;-) – RobG

14

Bạn đã trích dẫn báo giá từ ngữ cảnh. Câu trả lời là in the paragraph above the quote:

Không gian tên là vùng chứa cho phép nhà phát triển gộp chức năng theo tên duy nhất, ứng dụng cụ thể. Trong JavaScript, không gian tên chỉ là một đối tượng khác có chứa các phương thức, thuộc tính và đối tượng.

(tôi nhấn mạnh)

Các quote:

Điều quan trọng cần lưu ý là trong JavaScript không có sự khác biệt ngôn ngữ cấp giữa các đối tượng và không gian tên thường xuyên.

Chỉ cần nói rằng điều này có nghĩa là "không gian tên" chỉ là một đối tượng được sử dụng làm "không gian tên".
Không có không gian tên "thực" trong JS.

0

Điều quan trọng cần lưu ý là trong JavaScript không có sự khác biệt về mức độ ngôn ngữ giữa các đối tượng thông thường và không gian tên.

Nó nói rằng một "không gian tên" không phải là một loại thành phần thực tế trong JavaScript, mà chỉ là sử dụng một đối tượng JavaScript cũ đơn giản.

1

Trước tiên, bạn có chắc chắn bạn biết không gian tên là gì không? Thật nhanh:

Hãy sử dụng sự tương tự. Trên máy tính của bạn, bạn có tệp. Nhưng bạn không chỉ có các tập tin bạn có thư mục. Tại sao?

Vì nếu không có thư mục, tên tệp sẽ phải là duy nhất và sẽ rất khó để giữ mọi thứ được sắp xếp.

Tương tự cho các tên biến nếu bạn chỉ có các biến toàn cầu. Nếu bạn chỉ có thể có các biến toàn cầu, mỗi tên biến sẽ phải là hoàn toàn duy nhất.

Điều này sẽ rất khó theo dõi. Rất có thể bạn sẽ phải sử dụng tên biến tương tự một cách tình cờ. Mã của bạn sẽ hoạt động hài hước và rất khó để theo dõi vấn đề.

Vậy giải pháp là gì?

Đúng vậy đặt biến của bạn vào thư mục, ahem, xin lỗi, tôi có nghĩa là không gian tên, đặt chúng vào không gian tên. Tôi phải tìm ra cách sử dụng phím backspace.

Dù sao, các ngôn ngữ như C# và Java cho phép bạn thực hiện chính xác này:

// C# - example of a language with built in support for namespaces 

namespace MySpace { 
    class MyClass { 
    } 
} 

namespace Facebook { 
    class MyClass { 
    } 
} 

Có không có xung đột vì lớp học nằm trong không gian tên khác nhau. Sau đó, trong mã của bạn nếu bạn muốn nhanh chóng chúng bạn sẽ viết một cái gì đó như thế này:

// C# again (JavaScript code coming up soon - keep scrolling) 
var myObject = new Facebook.MyClass(); 

Đó là tuyệt vời nhưng JavaScript không có một từ khoá namespace. Về mặt kỹ thuật nó không có không gian tên, những gì nó có là một số lập trình viên thực sự thông minh.

Giải pháp của họ? Sử dụng các đối tượng.

// JavaScript 
var MySpace = {}; 
MySpace.MyFunction = function() { 
    // insert brilliant code here 
}; 

var Facebook = {}; 
Facebook.MyFunction = function() { 
    // insert more brilliant code here 
}; 

Bây giờ bạn có 2 chức năng với tên "giống nhau" không cản trở nhau. Nếu bạn muốn gọi phiên bản Facebook của MyFunction bạn sẽ viết mã như thế này:

// JavaScript 
Facebook.MyFunction(); 

Như bạn có thể thấy trong các ví dụ MySpaceFacebook đang thực sự đối tượng, nhưng họ là những đối tượng mà chúng ta đang sử dụng chỉ để chức năng riêng biệt và các biến, có nghĩa là chúng tôi đang sử dụng chúng cho không có gì hơn để phục vụ như không gian tên.

Một Chú thích

Rất nhiều lần bạn sẽ thấy "namespace" đối tượng tuyên bố như thế này:

var MySpace = MySpace || {}; 

Điều này có nghĩa MySpace = MySpace nếu đối tượng MySpace đã tồn tại. Nếu không, nó được gán một đối tượng trống mới.Đây là cách tái sử dụng đối tượng/không gian tên MySpace trong nhiều tệp.

Mỗi tệp sẽ thêm các hàm và biến riêng của nó vào cùng một đối tượng "không gian tên". Ví dụ:

var MySpace = MySpace || {}; 
MySpace.a = 10; 

var MySpace = MySpace || {}; 
MySpace.b = 20; 

Bạn kết thúc với một đối tượng MySpace có các biến ab. Điều này đúng ngay cả khi mã nằm trong các tệp khác nhau và ngay cả khi bạn đảo ngược thứ tự.

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