2012-05-10 37 views
7

Có thể đặt chức năng mặc định trên một đối tượng, chẳng hạn khi tôi gọi myObj() chức năng đó được thực hiện? Hãy nói rằng tôi có sau func đối tượngChức năng mặc định trên một đối tượng?

function func(_func) { 
    this._func = _func; 

    this.call = function() { 
     alert("called a function"); 
     this._func(); 
    } 
} 

var test = new func(function() { 
    // do something 
}); 

test.call(); 

Tôi muốn thay thế test.call() với chỉ đơn giản test(). Điều đó có thể không?

+0

Đây là một trùng lặp. Đang cố gắng tìm nó ... –

+0

@KendallFrey: Ồ đúng không? Xin lỗi vì điều đó. –

+0

có thể trùng lặp của [Tôi có thể quá tải một đối tượng có chức năng không?] (Http://stackoverflow.com/questions/4946794/can-i-overload-an-object-with-a-function) –

Trả lời

6

trở lại một chức năng:

function func(_func) { 
    this._func = _func; 

    return function() { 
     alert("called a function"); 
     this._func(); 
    } 
} 

var test = new func(function() { 
    // do something 
}); 

test(); 

nhưng sau đó this đề cập đến trở chức năng (? Bên phải) hoặc cửa sổ, bạn sẽ có bộ nhớ cache this để truy cập nó từ bên trong hàm (this._func();)

function func(_func) { 
    var that = this; 

    this._func = _func; 

    return function() { 
     alert("called a function"); 
     that._func(); 
    } 
} 
+0

Ngọt ngào, điều đó đã làm lừa. Cảm ơn! –

+1

Điều đó đã giúp ích rất nhiều. Chỉ cần cho hoots, đây là cách tôi vết thương bằng cách sử dụng này: http://jsfiddle.net/TkZ6d/9/ Cảm ơn một lần nữa! –

0

Tuyệt vời!

Tuy nhiên, vấn đề là đối tượng bạn trả lại không phải là "func". Nó không có nguyên mẫu của nó, nếu có. Trông tuy nhiên dễ dàng để thêm:

func = function (__func) 
 
{ 
 
    var that = function() 
 
    { 
 
    return that.default.apply(that, arguments) 
 
    } 
 
    that.__proto__ = this.__proto__ 
 
    if (__func) 
 
    that.default = __func 
 

 
    return that 
 
} 
 

 
func.prototype = { 
 
    serial: 0, 
 
    default: function (a) { return (this.serial++) + ": " + a} 
 
} 
 

 
f = new func() 
 
f.serial = 10 
 
alert(f("hello")) 
 

 
f = new func(function (a) { return "no serial: " + a }) 
 
alert(f("hello"))

Xem thêm: proto and prototype

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