2012-07-09 39 views
6

Đây là một câu hỏi giả thuyết, nó thực sự không có sử dụng thực tế, nhưng ...JS khôi phục default/chức năng toàn cầu

Hãy nói rằng bạn đã làm:

document.open = null; 

Làm thế nào sẽ một khôi phục document.open về chức năng ban đầu của nó, liệu điều này có thể (không có bộ nhớ tạm thời do người dùng tạo) không? Document.open có được lưu trữ ở một vị trí khác dưới tên ít được biết đến không? Cảm ơn bạn! :)

Trả lời

1
var temp = document.open; 
document.open = null; 

và sau đó bạn khôi phục lại chức năng ban đầu với

document.open = temp; 
+1

Thú vị - Giả sử bạn không có nhiệt độ! Có cách nào khác không? –

+0

bạn cần tạo tham chiếu theo một số cách ... ví dụ: chạy ngay lập tức tự thực hiện chức năng nặc danh đi qua document.open như đối số – fcalderan

+1

Tôi hầu như tự hỏi nếu trình duyệt lưu trữ một tham chiếu thứ hai trên riêng của mình –

9

Ghi đè document.open tạo ra một biến/hàm có tên open trực tiếp trên đối tượng document. Tuy nhiên, chức năng ban đầu không phải trên chính đối tượng mà là nguyên mẫu của nó - vì vậy bạn thực sự có thể khôi phục lại nó.

Chức năng open là từ HTMLDocument.prototype để bạn có thể truy cập bằng cách sử dụng HTMLDocument.prototype.open.

Để gọi nó là trực tiếp, sử dụng .call() để xác định đối tượng sử dụng nó trên:

HTMLDocument.prototype.open.call(document, ...); 

Bạn cũng có thể khôi phục document.open nó bằng cách đơn giản gán cho nó:

document.open = HTMLDocument.prototype.open; 

Tuy nhiên, hãy nhớ rằng HTMLDocument và do đó, document là các đối tượng lưu trữ và thường là một ý tưởng hay không để gây rối với chúng - đặc biệt là trong IE, mọi thứ có thể sẽ xảy ra nếu bạn làm như vậy.

+0

Ahah! Thật tuyệt khi biết, cảm ơn! :) Để phản hồi chỉnh sửa của bạn ... Hấp dẫn! Tôi không bao giờ biết điều này, cảm ơn bạn một lần nữa vì thông tin! :) Tôi sẽ chấp nhận điều này ngay sau khi tôi có thể –

+0

điều cần biết: +1 – fcalderan

+1

làm cách nào để thực hiện điều đó đối với một cái gì đó như 'cảnh báo'? nghĩa là ghi đè 'window.alert' với hàm tùy chỉnh là khá tầm thường, nhưng việc khôi phục lại là thử thách mà không giữ tham chiếu tạm thời: http://jsfiddle.net/ovfiddle/kcLBd/ –

4
delete document.open; 

Không trực quan, nhưng việc sử dụng từ khóa xóa trên chức năng tùy chỉnh sẽ khôi phục chức năng gốc, ít nhất là nguyên mẫu chưa bị ghi đè.

Ví dụ:

> console.log 
function log() { [native code] } 

> console.log = function() { } 
function() { } 

> console.log("Hello world"); 
undefined 

> delete console.log; 
true 

> console.log("Hello world"); 
Hello world 

Làm việc theo cùng một cách với document.open và chức năng built-in khác.

+0

'xóa cảnh báo' và' xóa window.alert' cả hai đều thất bại, giống như 'window.alert = window.prototype.alert' không thành công trong http://jsfiddle.net/ovfiddle/kcLBd. Khác hơn thế, câu trả lời tuyệt vời. – 7vujy0f0hy

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