Cùng một vấn đề như được đăng trong câu hỏi này: Javascript Class Inheritance
Như những người khác đã đề cập bạn đang mất các chức năng ngữ cảnh. Các hàm là các đối tượng giống như bất kỳ thứ gì khác trong javascript.bằng cách gọi var f = document.write
bạn đang nhận được một tham chiếu đến hàm, nhưng hàm không có tham chiếu đến tài liệu mà nó cần.
dụ:
// give the window a new funciton
window.foo = function() {
console.log('FOO!);
}
// get a reference to this funciton
var fn = window.foo;
// call via reference works and outputs 'FOO!!' to the console
fn();
// attach it to your object
var myObject = {};
myObject.Foo = fn;
// call it it still works
myObject.Foo();
bây giờ nếu chức năng tham chiếu this
thì trên không hoạt động vì this
dependes vào bối cảnh gọi. Cách để lưu các bối cảnh tại thời điểm này là sử dụng một kết thúc như thế này ...
// remember this is the window context
var fn = function (s) {
document.write(s);
}
Lý do mã trên hoạt động là javascript nhìn vào chức năng và không thấy một đối tượng document
địa phương để nó đi lên phạm vi và thấy phạm vi bên ngoài (trong trường hợp này là đối tượng window
) có một tài liệu và các cuộc gọi viết trên đó. Thực hiện cuộc gọi đến document.write()
giống như việc viết window.document.write()
Nó có thể không hoạt động vì hàm 'write' dự kiến sẽ được thực thi trên ngữ cảnh của' tài liệu' chứ không phải 'cửa sổ'. – Prusse
Bạn có thể '.bind()' nó, nhưng bạn cần một shim cho các trình duyệt cũ hơn, và tôi không biết nó sẽ ảnh hưởng đến hiệu suất như thế nào. 'var f = document.write.bind (tài liệu);' – user113716