Có một mẫu thường được gọi là "Ủy quyền", giải quyết vấn đề này.
Trong javascript, một thực hiện không-quá-lạ mắt có thể trông như thế này:
/** class Delegate **/
var Delegate = function(thisRef, funcRef, argsArray) {
this.thisRef=thisRef;
this.funcRef=funcRef;
this.argsArray=argsArray;
}
Delegate.prototype.invoke = function() {
this.funcRef.apply(this.thisRef, this.argsArray);
}
/** static function Delegate.create - convenience function **/
Delegate.create = function(thisRef, funcRef, argsArray) {
var d = new Delegate(thisRef, funcRef, argsArray);
return function() { d.invoke(); }
}
Trong ví dụ của bạn, bạn sẽ sử dụng nó như thế này:
this.b = function() {
Z(Delegate.create(this, this.c));
}
bạn cũng có thể viết các chức năng mong nhận được một Đại biểu:
function Z(d) {
d.invoke();
}
sau đó, trong A
, impl của bạn của b
trở thành:
this.b = function() {
var d = new Delegate(this, this.c);
Z(d);
SomeOtherFunc(d);
}
Các Delegate
chỉ cung cấp một cách phù hợp đơn giản của việc đóng gói this
tài liệu tham khảo (mà bạn đã gọi self
), trong một trường hợp đối tượng có thể được xử lý giống như bất kỳ trường hợp đối tượng khác. Đó là dễ đọc hơn, và nó giúp bạn khỏi bị ô nhiễm phạm vi chức năng của bạn với các biến không cần thiết như self
. Một thực hiện đại biểu fancier có thể có phương pháp riêng của mình và trạng thái liên quan khác. Nó cũng có thể xây dựng các đại biểu theo cách mà nó giúp giảm thiểu một số vấn đề quản lý bộ nhớ liên quan đến phạm vi (mặc dù mã tôi đã hiển thị ở đây chắc chắn không phải là một ví dụ về điều đó).
Đúng vậy, trong ví dụ đơn giản này, không có lý do cho sự wrapper. Nó không phải là khó để thụ thai của một ví dụ mà nó là cần thiết. (Thay đổi các thông số, vv) Nếu bạn không bọc, mặc dù, tôi cho rằng đóng cửa được thông qua như người ta có thể mong đợi? –
không có trình bao bọc ẩn danh, 'c' được gọi với tham chiếu' this' sai. – Lee
@ Jonathan - Vâng, đúng vậy, trong trường hợp đó, bạn muốn chuyển một biến số giống như bạn có 'self' giúp bạn truy cập vào những gì đang đóng. –