2010-03-24 7 views

Trả lời

42

Vâng, trong javascript, đối tượng bất kỳ là đối tượng expando. Ý nghĩa của nó là, như bài viết đề cập, bất cứ khi nào bạn cố truy cập thuộc tính , nó sẽ tự động được tạo.

var myObj = {}; // completely empty object 
myObj.myProp = 'value'; 

Khoảnh khắc bạn gán myProp một giá trị, tài sản myProp là tự động tạo ra, dù cho nó không tồn tại trước đó. Trong rất nhiều ngôn ngữ khác, chẳng hạn như C#, điều này là không bình thường có thể (thực sự C# đã kích hoạt hỗ trợ đối tượng expando là tốt, nhưng đó là ngoài điểm). Để truy cập vào một thuộc tính trong một lớp bình thường trong C#, bạn cần xác định trong lớp rằng nó thực sự có thuộc tính này.

Không hoàn toàn chính xác. Xem bình luận của npup dưới đây để làm rõ.

+46

Không .. nếu bạn chỉ "cố truy cập" thuộc tính, tất nhiên nó sẽ không được "tạo tự động". Bạn có thể xô một tài sản bất cứ khi nào bạn cảm thấy thích nó, nhưng đó không phải là điều tương tự. Chỉ cần liên lạc với 'foo.bar' không tồn tại và nhận được' undefined' back không làm 'foo' * có * thuộc tính' bar'. – npup

+4

Vì vậy, để tổng hợp: khả năng expando là * viết *, không truy cập. Các đối tượng Javascript cho phép bạn viết một thuộc tính mới cho một đối tượng mà không cần phải xác định trước thuộc tính đó, như được yêu cầu trong một số ngôn ngữ khác. – XML

4

Một bài viết được viết trong năm 2007 có sử dụng document.all (tùy theo từng chỉ cách để truy cập vào phần tử)? Đó là một lá cờ đỏ lớn.

Nó chỉ là mặc quần áo lên "Bạn có thể thêm thuộc tính cho một đối tượng" với một số buzzwords.

Chúng tôi cần có khả năng thực hiện điều này bởi vì nếu không chúng tôi sẽ không thể lưu trữ dữ liệu và điều đó sẽ làm cho JavaScript trở thành một ngôn ngữ vô dụng.

(Tất cả mọi thứ là một mảng? Không nó không phải là. Và nó lặp qua một đối tượng mà không có một wrapper hasOwnProperty. Đó không phải là an toàn. Chỉ cần tránh xa bài viết, nó còn tồi tệ hơn vô dụng)

+0

Vâng, bài viết đó là một thảm họa thực sự. Ow. – npup

10

Mọi thứ trừ các loại nguyên thủy (chuỗi, số, boolean) là các đối tượng và hỗ trợ Cấu trúc khóa: giá trị. các thuộc tính (khóa) có thể được truy cập và thiết lập bằng cách sử dụng ký hiệu chấm cũng như các dấu ngoặc vuông.

var myObj = {}; 
myObj.myProp1 = 'value1'; //works, an expando property 
myObj[myProp2] = 'value2'; // doesn't work, myProp2 is an undefined name. 
myObj['myProp2'] = 'value2'; // works , an expando property 
myObj[2010]= 'value'; //note the key is number, still works, an expando property?? 
myObj.2010 = 'value'; // FAILS. to use dot notation, key must be a string 
+2

Ngay cả các kiểu nguyên thủy cũng được bao bọc tự động vào các đối tượng khi cần thiết. 'var i = số mới (3); i.someProperty = "someValue"; console.log (i.someProperty); ' – igor

+2

@igor:" Tự động "là từ sai, và một chút gây hiểu nhầm. Bạn đã bao bọc một cách rõ ràng 'i' trong một đối tượng Number, cho phép bạn sử dụng các thuộc tính expando. Do đó, điều này sẽ không hoạt động: 'var i = 3; i.someProperty = "someValue"; console.log (i.someProperty); ' – theazureshadow

+0

ah .. xin lỗi .. bạn nói đúng. Toán tử 'mới' thực hiện công việc của mình. Những điều sau không hoạt động: var i = Number (3); i.someProperty = "someValue"; console.log (i.someProperty); – igor

4

JavaScript biến các thành phần với ID cụ thể của tên thành expandos của đối tượng DOM được trả về. Nó được giải thích here.