2010-02-21 21 views
36

Tôi tự hỏi nếu nó có thể cho một đối tượng trong javascript để xóa chính nó một khi nó đã hoàn thành nhiệm vụ của mình.Một đối tượng có thể tự động xóa chính nó trong javascript khi nó đã đạt được mục đích của nó không?

Ví dụ, tôi có các đối tượng sau đây ...

var myObject = Object.create(baseObject); 
myObject.init = function() { 
    /* do some stuff... */ 
    delete this; 
}; 
myObject.init(); 

Liệu công việc này? Nếu không, có cách nào khác không?

Trả lời

45

Điều đó sẽ không hoạt động, trước tiên bởi vì giá trị this được kết hợp với ngữ cảnh thực thi là không thể thay đổi.

Bây giờ bạn có thể nghĩ rằng xóa myObject (bởi delete myObject;) có thể hoạt động, nhưng điều đó cũng không làm được.

biến thực sự thuộc tính của Object Variable, đối tượng này là không thể truy cập bằng mã, nó là ngay trước trong chuỗi phạm vi, nơi bạn làm việc khai báo biến.

Tuyên bố biến, tạo các thuộc tính đó với thuộc tính { DontDelete } và điều này làm cho toán tử delete thất bại.

Tùy chọn nếu bạn muốn đạt được điều này là hủy kích hoạt ví dụ myObject của bạn, nhưng điều đó không đảm bảo rằng một tham chiếu khác vẫn trỏ đến đối tượng đó.

bài giảng Khuyến cáo:

+0

Nó xuất hiện các liên kết bclary.com không còn hợp lệ. Tôi nghĩ rằng đây là những bản sửa lỗi: 1) https://bclary.com/2004/11/07/ecma-262.html#a-10.1.7 và 2) https://bclary.com/2004/11/07 /ecma-262.html#a-10.1.3 – ThisClark

10

No. this chỉ là tham chiếu cục bộ đối tượng để xóa nó không làm cho đối tượng không tồn tại. Không có cách nào để một đối tượng tự hủy theo cách này. Nếu bạn có những đồ vật lớn mà bạn cho là cần được xóa sau đó thì bạn nên xem xét sử dụng các mẫu Mặt tiền hoặc Chiến lược.

+0

+1 để sử dụng tên mẫu! Cảm ơn cho các tip – SomeShinyObject

4

Bạn có thể thử

window.namespace.myObject = Object.create(baseObject); 

namespace.myObject.init = function() { 

    /* do some stuff... */ 

    delete window.namespace.myObject; 

} 

namespace.myObject.init(); 
+0

Điều này sẽ không giải quyết được vấn đề, câu hỏi là xóa toàn bộ đối tượng. – Silom

+0

Giả sử tham chiếu duy nhất cho đối tượng là 'namespace.myObject', sau đó xóa tham chiếu đó sẽ khiến đối tượng cuối cùng bị thu gom rác. Tuy nhiên, 'xóa' không phải là' dealloc', như được chỉ ra trong câu trả lời đã chọn. – Patrick

+0

Tôi đang xây dựng một lớp, GameObject, cần có phương thức, hủy(). Điều này vẫn không giúp ... –

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