Функция Javascript имеет подфункции / переменные - PullRequest
6 голосов
/ 05 февраля 2011

Это рабочий код:

var test = function ()
{
    console.log(test.data);
};

test.data = 'hello';

test.set = function (data)
{
    test.data = data;
};

test.set('Test');
test();

Это выводит Test на мою консоль javascript. Теперь мне было интересно, есть ли способ сделать это, используя что-то вроде этого?

var test = {
    this: function ()
    {
        console.log(test.data);
    },

    data: 'hello',

    set: function (data)
    {
        test.data = data;
    }
};

Ответы [ 3 ]

6 голосов
/ 05 февраля 2011

Как я написал в своем комментарии, вы не можете сделать объект "вызываемым". Однако вы можете автоматизировать процесс из вашего первого примера:

function extend(func, props) {
    for(var prop in props) {
        if(props.hasOwnProperty(prop)) {
            func[prop] = props[prop];
        }
    }
    return func;
}

и затем вызовите его с помощью:

var test = extend(function(){
    console.log(test.data);
},
{
    data: 'hello',    
    set: function (data) {
        this.data = data;   // note that I changed it to `this.data`
    }
});

DEMO


Тем не менее, я думаю, что вы не должны использовать такие функции. Это будет легче понять, если у вас просто «нормальный» объект и вызывать каждый метод с obj.method() вместо obj().

По крайней мере, вы должны очень тщательно задокументировать это.

3 голосов
/ 05 февраля 2011

Как насчет того, чтобы сделать что-то вроде этого:

function Test () {
  this.data = 'hello';
  this.set = function (data)
    {
        test.data = data;
    }
  this.log = function ()
    {
        console.log(test.data);
    }
}

var test = new Test ();
test.set('Test');
test.log();

Это дает вам преимущество в том, что вы можете легко создавать новые экземпляры.


Если вы просто хотите разовый, я быскажи, что твое собственное предложение - почти то, что ты хочешь:

var test = {
    log: function ()
    {
        console.log(test.data);
    },

    data: 'hello',

    set: function (data)
    {
        test.data = data;
    }
};

test.set('Test');
test.log();

Но, возможно, твой вопрос заключался в том, как избежать ".log"?

0 голосов
/ 05 февраля 2011

Вы можете хранить любые функции в свойствах вашего объекта. И вы можете вызвать их:

let f = { fun1: function () 
                {
                     return 1; 
                } 
        };
f.fun1();

будет работать отлично. Я не уверен, что вы можете использовать «this» в качестве имени свойства, поскольку оно является ключевым словом. Вероятно, нет проблем с этим, но это может вводить в заблуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...