Tôi đang đăng câu trả lời này chỉ để khen BoltClock's answer bằng một số thông tin chi tiết bổ sung bằng cách xem trực tiếp mã nguồn trình phát flash. Chúng tôi thực sự có thể thấy mã AVM chuyên cung cấp chức năng này và được viết bằng C++. Chúng ta có thể nhìn thấy bên trong ArrayObject.cpp đoạn mã sau:
// Iterator support - for in, for each
Atom ArrayObject::nextName(int index)
{
AvmAssert(index > 0);
int denseLength = (int)getDenseLength();
if (index <= denseLength)
{
AvmCore *core = this->core();
return core->intToAtom(index-1);
}
else
{
return ScriptObject::nextName (index - denseLength);
}
}
Như bạn có thể thấy khi có một tài sản hợp pháp (đối tượng) để trở về, người ta nhìn lên từ lớp ScriptObject
, đặc biệt là phương pháp nextName()
. Nếu chúng ta xem xét các phương thức đó trong ScriptObject.cpp:
Atom ScriptObject::nextName(int index)
{
AvmAssert(traits()->needsHashtable());
AvmAssert(index > 0);
InlineHashtable *ht = getTable();
if (uint32_t(index)-1 >= ht->getCapacity()/2)
return nullStringAtom;
const Atom* atoms = ht->getAtoms();
Atom m = ht->removeDontEnumMask(atoms[(index-1)<<1]);
if (AvmCore::isNullOrUndefined(m))
return nullStringAtom;
return m;
}
Chúng ta có thể thấy rằng thực tế, như mọi người đã chỉ ra ở đây rằng VM đang sử dụng bảng băm. Tuy nhiên trong các chức năng này có một chỉ số cụ thể được cung cấp, điều này sẽ gợi ý, ngay từ cái nhìn đầu tiên, rằng phải có một thứ tự cụ thể.
Nếu bạn đào sâu hơn (tôi sẽ không đăng tất cả mã ở đây), có rất nhiều phương thức từ các lớp khác nhau tham gia vào/cho từng chức năng và một trong số đó là phương pháp ScriptObject::nextNameIndex()
. toàn bộ bảng băm và chỉ bắt đầu cung cấp các chỉ mục cho các đối tượng hợp lệ trong bảng và tăng chỉ số ban đầu được cung cấp trong đối số, miễn là giá trị tiếp theo trỏ tới một đối tượng hợp lệ. Nếu tôi đúng trong cách giải thích của tôi, đây sẽ là nguyên nhân đằng sau việc tra cứu ngẫu nhiên của bạn và tôi không tin rằng sẽ có bất kỳ cách nào để ép buộc một bản đồ được chuẩn hóa/đặt hàng trong các hoạt động này.
Nguồn
Đối với những người bạn của những người có thể muốn lấy mã nguồn cho phần mã nguồn mở của đèn flash player, bạn có thể lấy nó từ các kho lanh lợi sau đây (bạn có thể tải về một snapshop trong zip như github vì vậy bạn không cần phải cài đặt lanh lợi):
http://hg.mozilla.org/tamarin-central - Đây là "ổn định" hoặc "giải phóng" kho
http://hg.mozilla.org/tamarin-redux - Đây là chi nhánh phát triển. Những thay đổi gần đây nhất cho AVM sẽ được tìm thấy ở đây. Điều này bao gồm hỗ trợ cho Android và như vậy. Adobe vẫn đang cập nhật và mở tìm nguồn cung ứng những phần này của trình phát flash, vì vậy nó là công cụ chính xác và hiện tại.
Trong khi tôi đang ở đó, điều này cũng có thể quan tâm: http://code.google.com/p/redtamarin/. Đó là một phiên bản được phân nhánh (và khá trưởng thành) của AVM và có thể được sử dụng để viết các ActionScript phía máy chủ. Neat công cụ và có một tấn thông tin cung cấp cho cái nhìn sâu sắc vào các hoạt động của AVM vì vậy tôi nghĩ rằng tôi muốn bao gồm nó quá.
Cách tôi nghĩ về một đối tượng như đã tuyên bố ở trên, giống như Bảng băm như được thấy trong một số ngôn ngữ khác, nơi bạn không bao giờ có thể tin tưởng thứ tự do cách nó tự xử lý nội bộ. Bạn có thể tìm thấy ý tưởng chung tại đây: http://en.wikipedia.org/wiki/Hash_table – ToddBFisher
câu hỏi hay. trong khi tôi không biết tại sao lặp lại các thuộc tính đối tượng dường như là ngẫu nhiên, tôi nhớ lại các chủ đề trước đây đang thảo luận các vấn đề tương tự và giải pháp là tạo một từ điển được chuyển tới một mảng được sắp xếp theo khóa hoặc giá trị của từ điển. tôi cũng muốn biết điều gì đang xảy ra ở đây. – TheDarkIn1978
Tôi nghĩ @ToddBFisher có ý tưởng đúng ở đây. Trong C++ điều này về cơ bản sẽ là một "bản đồ không có thứ tự", cụ thể là std :: unordered_map từ chuẩn C++ 11 mới được thực hiện trong bản phát hành TR1. Xem http://en.wikipedia.org/wiki/Unordered_associative_containers_(C%2B%2B) và http://www.cplusplus.com/reference/stl/map/ để biết thêm chi tiết về khái niệm tại nơi làm việc. –