Đối tượng expando trong javascripts là gì?Đối tượng expando Javascript
Vì mục đích gì chúng tôi cần điều này? Bất kỳ ví dụ hoàn chỉnh sẽ được đánh giá
tôi thấy 1 bài viết ở đây Javascript: The red-headed stepchild of web development
Đối tượng expando trong javascripts là gì?Đối tượng expando Javascript
Vì mục đích gì chúng tôi cần điều này? Bất kỳ ví dụ hoàn chỉnh sẽ được đánh giá
tôi thấy 1 bài viết ở đây Javascript: The red-headed stepchild of web development
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õ.
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)
Vâng, bài viết đó là một thảm họa thực sự. Ow. – npup
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
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
@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
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
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.
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
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