2010-05-03 26 views
10

Công cụ JavaScript Spider-Monkey triển khai chức năng gọi lại __noSuchMethod__ cho các đối tượng JavaScript.Truy cập vào thuộc tính chưa được xác định trong JavaScript

Chức năng này được gọi bất cứ khi nào JavaScript cố gắng thực hiện một phương thức chưa xác định của đối tượng.

Tôi muốn đặt chức năng gọi lại cho đối tượng sẽ được gọi bất cứ khi nào thuộc tính không xác định trong đối tượng được truy cập hoặc gán cho.

Tôi chưa tìm thấy chức năng __noSuchProperty__ được triển khai cho JavaScript Objects và tôi là curios nếu có bất kỳ giải pháp nào đạt được kết quả tương tự.

Xét đoạn mã sau:

var a = {}; 
a.__defineGetter__("bla", function(){alert(1);return 2;}); 
alert(a.bla); 

Nó tương đương với [alert(1);alert(2)] - mặc dù a.bla là undefined.

Tôi muốn đạt được kết quả tương tự nhưng để tính chưa biết (tức mà không biết trước rằng a. "Bla" sẽ là tài sản truy cập)

Trả lời

4

Trong phiên bản tiếp theo ECMAScript của nó nên được khá dễ dàng, sử dụng Object.observe đọc thêm ở đây: http://addyosmani.com/blog/a-few-new-things-coming-to-javascript/

+0

Cảm ơn Moshe. Đã chấp nhận câu trả lời này, vì nó giải quyết được câu hỏi gốc. – avri

+1

Câu trả lời này không giải quyết được câu hỏi. Tính năng bạn đang tìm kiếm được gọi là ['Proxy' và nó sẽ không được triển khai bất kỳ lúc nào] (http://stackoverflow.com/q/6429521/1269037). –

2

tôi muốn thiết lập một chức năng gọi lại để một Đối tượng sẽ được gọi bất cứ khi nào một thuộc tính không xác định trong đối tượng được truy cập hoặc gán cho.

Mặc dù đây không phải là câu trả lời đầy đủ, hãy nhớ rằng việc gán cho các thuộc tính chưa xác định của đối tượng là một tính năng chính của ngôn ngữ JavaScript.

Cũng lưu ý rằng __noSuchMethod__is a non-standard method, được thực thi bởi các công cụ JavaScript của Mozilla. Có một open feature request cho việc này sẽ được triển khai trong công cụ V8 của Google Chrome, nhưng theo tôi biết điều này không được hỗ trợ trong các trình duyệt khác.

Tính đến tháng hai năm 2014, It looks like this won't be supported any time soon.

+0

Cám ơn ans của bạn wer - Tôi nên tinh chỉnh câu hỏi của mình như sau: Có cách nào để thực hiện tương tự trong công cụ JavaScript Spider-Monkey không? – avri

+0

@avri: 'noSuchMethod' được hỗ trợ trong SpiderMonkey, nhưng tôi nghi ngờ rằng bạn sẽ tìm thấy một phương pháp sẵn có mà bắt nỗ lực để gán cho các thuộc tính không xác định, bởi vì đây thực sự là các tính năng của ngôn ngữ. –

+1

Tôi không nghĩ rằng việc gán cho các thuộc tính không xác định của một đối tượng là một tính năng chính của ngôn ngữ JavaScript là quan trọng - thực tế là, JavaScript cung cấp các phương thức __defineGetter__ và __defineSetter__. Hãy xem xét mã sau: var a = {}; a .__ defineGetter __ ("bla", function() {alert (1); return 2;}); cảnh báo (a.bla); Nó tương đương với [cảnh báo (1); cảnh báo (2)] - mặc dù a.bla không xác định. Tôi muốn đạt được kết quả tương tự nhưng với các thuộc tính không xác định (tức làmà không biết trước rằng a. "bla" sẽ là tài sản được truy cập) – avri

2

Up, guys Tôi nghĩ rằng chúng ta cần phải bỏ phiếu cho tính năng này trong danh sách các vấn đề Google V8, đây http://code.google.com/p/v8/issues/detail?id=264

Dường như không có sự quan tâm nhiều đến tính năng rất quan trọng này . :(

+0

[Nhóm phát triển V8 không quan tâm đến nó] (http://stackoverflow.com/q/6429521/1269037). –

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