2009-06-30 34 views
19

Đi qua tài liệu javascript, tôi thấy hai chức năng sau trên một đối tượng javascript trông thú vị:Listener cho bất động sản thay đổi giá trị trong một đối tượng javascript

.watch - Đồng hồ cho một tài sản được gán một giá trị và điều hành một chức năng khi điều đó đã xảy ra.
.unwatch - Xóa điểm quan sát được đặt bằng phương thức đồng hồ.

mẫu sử dụng:

o = { p: 1 }; 
o.watch("p", function (id,oldval,newval) { 
    console.log("o." + id + " changed from " + oldval + " to " + newval) 
    return newval; 
}); 

Bất cứ khi nào chúng ta thay đổi giá trị tài sản của "p", chức năng này được kích hoạt.

o.p = 2; //logs: "o.p changed from 1 to 2" 

Tôi đang làm việc trên javascript trong vài năm nhanh và không bao giờ sử dụng các chức năng này.
Có thể một số người vui lòng ném một số trường hợp sử dụng tốt mà các chức năng này sẽ có ích không?

+2

Những chỉ sẵn có cho các trình duyệt Gecko dựa, như Mozilla Firefox. Internet Explorer cho thấy một phương thức tương tự trên các đối tượng, được gọi là onpropertychange. –

Trả lời

8

Đồng hồ thực sự được thiết kế để xác thực giá trị thuộc tính. Ví dụ, bạn có thể xác nhận rằng một cái gì đó là một số nguyên:

obj.watch('count', function(id, oldval, newval) { 
    var val = parseInt(newval, 10); 
    if(isNaN(val)) return oldval; 
    return val; 
}); 

Bạn có thể sử dụng nó để xác nhận chuỗi dài:

obj.watch('name', function(id, oldval, newval) { 
    return newval.substr(0, 20); 
}); 

Tuy nhiên, đây là những chỉ có sẵn trong các phiên bản mới nhất của SpiderMonkey javascript động cơ . Tuyệt vời nếu bạn đang sử dụng Jaxer hoặc nhúng công cụ SpiderMonkey, nhưng chưa thực sự có sẵn trong trình duyệt của bạn (trừ khi bạn đang sử dụng FF3).

+1

Cảnh báo, hiện khả dụng trên tất cả các trình duyệt hiện đại. Gợi ý: Thay vào đó hãy sử dụng getter và setter. –

1

Bạn có thể xem thư viện Javascript Propery Events. Đó là một thư viện nhỏ mở rộng Object.defineProperty với một số người gọi sự kiện mà tôi đã thực hiện gần đây. Nó thêm một vài thuộc tính on[event] có thể được sử dụng như thuộc tính on[event] của HTML-Objects. Nó cũng có một kiểm tra kiểu đơn giản, gọi là sự kiện onerror nếu nó không thành công.

Lấy mã của bạn nó sẽ dẫn đến một cái gì đó như thế này:

var o = {} 
Object.defineProperty(o, "p", { 
    value:1, 
    writable:true, 
    onchange:function(e){ 
     console.log("o." + e.target + " changed from " + e.previousValue + " to " + e.returnValue); 
    } 
}) 
Các vấn đề liên quan