2012-05-10 6 views
7

Возможно ли установить функцию по умолчанию для объекта, чтобы при вызове myObj() эта функция выполнялась? Скажем, у меня есть следующие func объектаФункция по умолчанию для объекта?

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

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

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

test.call(); 

Я хотел бы заменить test.call() с просто test(). Это возможно?

+0

Это дубликат. Попытка найти его ... –

+0

@ KendallFrey: О, это так? Извини за это. –

+0

Возможный дубликат [Можно ли перегрузить объект с помощью функции?] (Http://stackoverflow.com/questions/4946794/can-i-overload-an-object-with-a-function) –

ответ

6

возвращение функции:

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

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

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

test(); 

но this относится к вернулся функцию (? Справа) или окно, вам придется кэшировать this для доступа к нему внутри функции (this._func();)

function func(_func) { 
    var that = this; 

    this._func = _func; 

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

Сладкий, что сделал трюк. Благодаря! –

+1

Это очень помогло. Просто для гудок, вот как я закончил это: http://jsfiddle.net/TkZ6d/9/ Еще раз спасибо! –

0

Отлично!

Однако проблема в том, что возвращаемый объект не является «func». У него нет своего прототипа, если он есть. Это выглядит тем не менее легко добавить:

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

Смотрите также: proto and prototype

Смежные вопросы