Tôi đang viết một thư viện ngăn xếp Javascript. Thư viện cần phát hiện một đối tượng hoặc chức năng cụ thể đã được lập trình viên tạo ra hoặc đã có mặt như một phần của môi trường (bao gồm các đối tượng dựng sẵn). Các đối tượng host đang trở nên có vấn đề một chút do hành vi không thể đoán trước của chúng, vì vậy tôi đang theo một cách thức môi trường để xác định xem một đối tượng cụ thể trong Javascript có phải là một đối tượng chủ (xem ECMAScript 3 - 4.3.8). Tuy nhiên, việc phân biệt các đối tượng host với các đối tượng gốc và các giá trị nguyên thủy rất hữu ích cho các lập trình viên trong các dự án khác, đặc biệt là trong các môi trường ít trình duyệt hơn, vì vậy tôi muốn tập trung vào đó hơn là các đối tượng host gây ra trong thư viện hoặc trên trình phân biệt đối tượng được xử lý.Có cách nào để phát hiện các đối tượng lưu trữ Javascript không?
Cho đến nay tôi chỉ có thể đưa ra các giải pháp phụ thuộc vào môi trường đang chạy mã javascript. Ví dụ:
// IE Only: does not implement valueOf() in Host Objects
var isHost = (typeof obj === 'object' && typeof obj.valueOf === 'undefined');
// Firefox Only: Host objects have own constructor
var isHost = (obj.constructor && obj.hasOwnProperty('constructor'));
tôi nhận thấy rằng phương pháp isPlainObject() riêng của jQuery cũng phụ thuộc vào môi trường, và rằng logic là khá phức tạp. Có lẽ điều này là bởi vì đó là bản chất của con thú với vật chủ (vì hành vi của chúng được xác định bởi môi trường), nhưng tôi muốn đào sâu hơn một chút để xem liệu điều này có thể và đang tự hỏi liệu có ai đó đã chạy hay không. qua vấn đề cụ thể này trước và có sẵn một giải pháp.
So. Có ai biết một giải pháp nền tảng độc lập đơn giản để kiểm tra đối tượng Host không? Và nếu nó chạy trong môi trường ít trình duyệt hơn như Node hoặc Rhino thì tốt hơn cho nó.
cách tiếp cận có thể xảy ra (có thể không hoạt động):
- Testing cho đặc điểm của các đối tượng máy chủ có vẻ như một nguyên nhân bị mất, cho rằng không có đặc điểm kỹ thuật cho hành vi của họ, tuy nhiên thử nghiệm cho dù đối tượng là một phần của Đặc tả ES3 có thể là một khả năng.
- Tôi đã thử sử dụng
Object.prototype.toString()
cho rằng nó được xác định khá cụ thể, nhưng kết quả là không thuyết phục vì một số môi trường (cụ thể là IE) chọn trả lại cùng một giá trị cho các đối tượng gốc và máy chủ. - Có thể thực hiện điều này bằng cách kiểm tra xem số
constructor
cuối cùng của một đối tượng thông qua chuỗi nguyên mẫu có thực sự làinstanceof Function
hay không.
Sự cố bạn đang cố giải quyết là gì? –
Tôi khá chắc chắn rằng điều này không hoạt động trong mọi môi trường, nhưng bạn có thể thử 'Object.prototype.toString.call (obj)' và xem bạn có nhận được '[object Object]' hay không sản xuất) hoặc một cái gì đó như '[đối tượng HTMLBodyElement]' để xác định xem nó là một đối tượng lưu trữ. – pimvdb
@CamiloMartin, Im làm việc trên một thư viện stacktrace javascript, các đối tượng lưu trữ đang trở thành một chút vấn đề do hành vi không thể đoán trước của họ vì vậy phải mã xung quanh chúng. Tuy nhiên, giải pháp ở đây rất hữu ích cho các lập trình viên trong các dự án khác, đặc biệt trong môi trường ít trình duyệt hơn. –