Bạn không thể thực hiện theo cách di động. Tuy nhiên, nếu bạn nghĩ về nó, nếu mục đích của delete foo.x;
là đặt lại giá trị x
, bạn có thể cung cấp phương thức reset()
trên foo
sẽ khôi phục thuộc tính bị thiếu về giá trị mặc định của chúng.
// Object creation and initialisation
(foo=function()
{
alert("called");
}).reset = function()
{
if(!("x"in this)) this.x=42;
};
foo.reset();
// Using our callable object
alert(foo.x); // 42
foo(); alert(foo.x); // called; 42
foo.x=3; foo.reset(); alert(foo.x); // 3 [*]
delete foo.x; foo.reset(); alert(foo.x); // 42
(Thử nghiệm trong Chromium và Internet Explorer, nhưng điều này sẽ hoạt động trong tất cả các trình duyệt.)
Trong dòng được đánh dấu bằng [*]
gọi là reset
thực sự là không cần thiết, nhưng nó ở đó để chứng minh rằng không quan trọng nếu bạn gọi nó là vô tình, và điều này tổng quát đến nhiều hơn một thuộc tính một cách dễ dàng.
Lưu ý rằng trong phần thân hàm của đối tượng có thể gọi this
sẽ tham chiếu đến phạm vi chứa, có thể sẽ không hữu ích cho chúng tôi vì chúng tôi muốn cơ quan chức năng truy cập các thành viên đối tượng. Để giảm thiểu điều này, hãy quấn nó trong một bao đóng như thế này:
foo = (function()
{
var self = function()
{
self.x = 42;
};
return self;
})();
foo(); alert(foo.x); // 42
Nguồn
2012-04-22 09:39:20
Cơ chế cơ bản là giống nhau, nhưng câu hỏi này hơi khác (ví dụ điểm bắt đầu khác hoàn toàn) và câu trả lời thêm giá trị đáng kể. Được đề cử để mở lại. – kanaka