Tôi nghĩ có lẽ bạn đang chạy vào vấn đề này về cách thức và thời điểm khai báo hàm so với mã từng bước (những gì mà mã thông báo gọi là mã số ) xảy ra.
Mã như thế này sẽ thất bại theo cách bạn mô tả, ví dụ:
var obj = new Thingy("Fred");
function Thingy(name) {
this.setName(name);
}
Thingy.prototype.setName = function(name) {
this.name = name;
};
... bởi vì bạn đang gọi các nhà xây dựng trước khi thêm setName
chức năng để nguyên mẫu. Lưu ý rằng việc gọi hàm tạo trước khi khai báo của nó là tốt, chỉ vì hàm tạo đang sử dụng hàm được thiết lập sau bằng mã lệnh có vấn đề. Thứ tự mà trình thông dịch JavaScript sẽ cố xử lý mã đó là:
- Tạo chức năng
Thingy
và làm cho nó khả dụng trong phạm vi.
- Thực hiện đường dây
var obj = ....
, gọi hàm tạo.
- Thực thi mã của nhà xây dựng (trong trường hợp này ném ngoại lệ vì không có hàm
this.setName
).
- Thực hiện đường dây
Thingy.prototype.setName = ...
. (Nếu không có trường hợp ngoại lệ nào được ném vào bước cuối cùng, tức là.)
Các bước này xảy ra cho mỗi khối tập lệnh (đầu tiên khai báo chức năng được thực hiện, sau đó mã lệnh được thực hiện theo thứ tự), và mặc dù ví dụ trên là khá rõ ràng, khi bạn bắt đầu tập hợp các phần từ nhiều vị trí khác nhau, bạn có thể tạo tình huống này ít rõ ràng hơn.
Các giải pháp, rõ ràng, là để đảm bảo bạn không xây dựng các đối tượng trước khi bạn đã thiết lập setName
tài sản:
function Thingy(name) {
this.setName(name);
}
Thingy.prototype.setName = function(name) {
this.name = name;
};
var obj = new Thingy("Fred");
... và một lần nữa, phía trên là khá rõ ràng, nhưng có thể tạo ra những tình huống này thay vì ít rõ ràng hơn trong thế giới thực.
Nghi ngờ của tôi là đây là những gì đang xảy ra trong trường hợp của bạn. Thật dễ dàng để chứng minh: Sử dụng trình gỡ lỗi như Firebug trên Firefox, VS.Net hoặc Trình gỡ lỗi tập lệnh cho IE, DevTools của Chrome, v.v., đặt điểm ngắt trên đường dây SystemList.prototype.refreshData = ...
và điểm ngắt trên đường mà bạn đang thực hiện new SystemList(...)
và xem điểm nào thực hiện trước.
Dưới đây là một vài câu đố thể hiện sự cố: This one không thành công trong hàm tạo, this one succeeeds.
Đã thêm ví dụ về cách tôi tạo obj. – nazbot
Bạn có chắc chắn rằng bạn đang sử dụng hàm tạo 'SystemList' * sau khi * tăng thêm số nguyên mẫu của nó không ?? – CMS
hoạt động cho tôi: http://jsbin.com/ebasa/edit – nickf