2012-05-10 8 views
7

Ist es möglich, eine Standardfunktion für ein Objekt festzulegen, so dass beim Aufruf myObj() diese Funktion ausgeführt wird? Lassen Sie uns sagen, dass ich die folgende func ObjektStandardfunktion für ein Objekt?

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

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

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

test.call(); 

I test.call() mit einfach test() ersetzen möchten haben. Ist das möglich?

+0

Dies ist ein Duplikat. Versuchen, es zu finden ... –

+0

@KendallFrey: Oh es ist? Das tut mir leid. –

+0

mögliche Duplikate von [Kann ich ein Objekt mit einer Funktion überladen?] (Http://stackoverflow.com/questions/4946794/can-i-overload-an-object-with-a-function) –

Antwort

6

Rückkehr eine Funktion:

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

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

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

test(); 

aber dann this bezieht sich auf die Funktion zurückgegeben (? Rechts) oder Fenster, müssen Sie this-Cache für den Zugriff aus dem Inneren der Funktion (this._func();)

function func(_func) { 
    var that = this; 

    this._func = _func; 

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

Süße, das hat die Trick. Vielen Dank! –

+1

Das hat sehr geholfen. Nur zum Spaß, hier ist, wie ich damit endete: http://jsfiddle.net/TkZ6d/9/ Nochmals vielen Dank! –

0

Großartig!

Das Problem ist jedoch, dass das Objekt, das Sie zurückgeben, kein "Func" ist. Es hat seinen Prototyp nicht, wenn überhaupt. Das sieht aber leicht hinzuzufügen:

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

Siehe auch: proto and prototype

Verwandte Themen