2012-05-10 1 views
7

Czy można ustawić domyślną funkcję obiektu, aby wywołać tę funkcję po wywołaniu myObj()? Powiedzmy, że mam następujące func obiektuDomyślna funkcja obiektu?

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

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

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

test.call(); 

Chciałbym wymienić test.call() ze po prostu test(). Czy to jest możliwe?

+0

To jest duplikatem. Próbuję go znaleźć ... –

+0

@KendallFrey: Oh to jest? Przepraszam za to. –

+0

możliwy duplikat [Czy mogę przeciążać obiekt za pomocą funkcji?] (Http://stackoverflow.com/questions/4946794/can-i-overload-an-object-with-a-function) –

Odpowiedz

6

powrót funkcją:

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

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

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

test(); 

ale potem this odnosi się do powrócił funkcji (? Prawo) lub okno, trzeba będzie buforować this do niego dostęp od wewnątrz funkcji (this._func();)

function func(_func) { 
    var that = this; 

    this._func = _func; 

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

Słodko, to zrobiło sztuczka. Dzięki! –

+1

To bardzo pomogło. Tylko pohukiwania, oto jak się skończyłem używając tego: http://jsfiddle.net/TkZ6d/9/ Jeszcze raz dziękuję! –

0

Świetnie!

Jednak problem polega na tym, że zwracany obiekt nie jest "func". Nie ma swojego prototypu, jeśli taki istnieje. Wygląda jednak łatwo dodać:

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"))

Zobacz także: proto and prototype