2011-10-17 39 views
24

Trong khi đi qua nguồn, tôi nhận thấy rằng 'chuyển đổi' được cho là sử dụng jQuery._data để lưu trữ trạng thái của phần tử. Tôi đã kiểm tra đối tượng jQuery.cache trong chrome và thấy rằng đối tượng dữ liệu của phần tử đã có một đối tượng khác bên dưới nó được thêm vào bởi từ jQuery với một số mà tôi đoán xác định duy nhất nó. Tuy nhiên, tôi không thấy dữ liệu nào liên quan đến trạng thái của phần tử. Đơn giản chỉ cần {olddisplay: 'block'}. Bất kỳ manh mối nào cho mục đích của jQuery._data và cách nó hoạt động như thế nào?Sự khác nhau giữa jQuery.data và jQuery._data (dữ liệu gạch dưới) là gì?

Tôi đã nhìn chằm chằm vào nguồn cả ngày .... xin vui lòng không cho tôi biết để xem nguồn. Mắt và não của tôi sẽ cảm ơn bạn.

+2

Thông thường bạn sẽ xem các biến và hàm (hoặc các phương thức/thuộc tính đối tượng) có nghĩa là được xử lý dưới dạng * private * hoặc một số ý nghĩa đặc biệt khác có ký tự được đặt trước như '_' để nhóm chúng lại với nhau theo phạm vi hoặc ứng dụng. Trong jQuery, nó chỉ có nghĩa là * đối xử với điều này là riêng tư với đối tượng *, tức là, ** Không truy cập từ bên ngoài. ** –

Trả lời

46

jQuery sử dụng _data để đặt cờ 'pvt' cho dữ liệu mà nó lưu trữ trên đối tượng. pvt được sử dụng để khi bạn yêu cầu dữ liệu công khai từ đối tượng, dữ liệu pvt không được trả lại. Điều này là để giữ cho việc sử dụng nội bộ của jQuery đối với cơ chế .data() (giống như việc chuyển đổi) thực hiện việc sử dụng công khai của .data().

Bạn có thể thấy tuyên bố này trong nguồn jQuery:

// For internal use only. 
_data: function(elem, name, data) { 
    return jQuery.data(elem, name, data, true); 
}, 

Mà chỉ cần gọi jQuery.data và buộc tham số thứ tư (đó là sự riêng tư) đến mức khó tin. Khi truy xuất dữ liệu, nếu cờ pvt được đặt, thì nó sẽ được truy xuất theo một cách hơi khác. Giao diện công khai tới .data() không hiển thị cờ pvt.

Bạn có thể xem ví dụ về pvt xử lý ở đây trong phần này của jQuery.data():

// An object can be passed to jQuery.data instead of a key/value pair; this gets 
// shallow copied over onto the existing cache 
if (typeof name === "object" || typeof name === "function") { 
    if (pvt) { 
     cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); 
    } else { 
     cache[ id ] = jQuery.extend(cache[ id ], name); 
    } 
} 

và sau đó trong hàm cùng, nhận xét này là khá mô tả:

// Internal jQuery data is stored in a separate object inside the object's data 
// cache in order to avoid key collisions between internal data and user-defined 
// data 
if (pvt) { 
    if (!thisCache[ internalKey ]) { 
     thisCache[ internalKey ] = {}; 
    } 
    thisCache = thisCache[ internalKey ]; 
} 
+0

Mô tả tuyệt vời. Cảm ơn bạn rất nhiều cho câu trả lời của bạn! – THEtheChad

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