Javascript Callable и прототип расширяемая функция - PullRequest
2 голосов
/ 07 июня 2011

В основном я искал возможность присоединять методы к исполняемой функции при использовании метода-прототипа javascript.Приведенный ниже код демонстрирует, о чем я говорю, и о функциональности, которую я ищу, но это действительно взлом.Обратите внимание, что у меня есть действительный объект для присоединения переменных, а также функции main и init.

function create(){
    var $this = {},
    main = function(){
        prototype.main.apply($this,arguments);
    };
    prototype.init.apply($this,arguments);
    //Add additional prototype methods by brute force, ugly
    for(i in prototype)-function(i){
        main[i]=function(){
            prototype[i].apply($this,arguments);
        }
    }(i);
    return main;
};

var prototype = {
    //called when you create the object
    init:function(text){
        console.log('init');
        this.text = text;
    },
    //called when you call the object
    main:function(){
        console.log('main');
        console.log(this);
    },
    method:function(){
        console.log(this.text);
    }
};

//create returns a function that also has methods
//the below line will call the init method
var fun = create('some variables');
//call main function
fun();
//call methods
fun.method();

Боюсь, я мог упустить что-то очевидное.

Здесь те же функции, что и выше, но вместо этого расширяется прототип глобальной функции.

РасширениеГлобальные свойства - это плохая практика, поэтому я ищу альтернативное решение.

Function.prototype = {
    //called when you create the object
    init:function(text){
        console.log('init');
        this.text = text;
    },
    //called when you call the object
    main:function(){
        console.log('main');
        console.log(this);
    },
    method:function(){
        console.log(this.text);
    }
};

function create(){
    var ret = function(){
        ret.main.call(main);
    };
    ret.init.apply(main,arguments);
    return ret;
};

//create returns a function that also has methods
//the below line will call the init method
var fun = create('some variables');
//call main function
//fun();
//call methods
fun.method();

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

Любое объяснение или соображения были бы великолепны!

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Вы можете поместить свои функции-прототипы в тело "конструктора". Технически это то, что вы делаете в настоящее время, но гораздо проще определить их явно, чем использовать вспомогательный метод. Затем вы можете еще больше упростить свой код, используя следующий шаблон для открытых и закрытых переменных и методов:

function Fun(text) {
    // This is the main function
    var fn = function () {
        return 'main';
    };

    // Attach public variables and methods
    fn.publicVariable = 'public';
    fn.publicMethod = function () {
        return text; // text is a "private variable"
    };

    // Do whatever initialization
    console.log('init');

    // Return the main function     
    return fn;
}

var fun = Fun('this is some text'); // "init"
fun() // "main"
fun.publicMethod() // "this is some text"
console.log(fun.publicVariable); // "public"
console.log(fun.text); // undefined
0 голосов
/ 07 июня 2011

Под "методом прототипа JavaScript" вы подразумеваете использование свойства Function.prototype для реализации наследования? Или вы просто пытаетесь создать функции, которые имеют инициализатор и прикрепленные методы?

Ваш пример выполняет последнее, поэтому я предполагаю, что это то, что вы ищете. Это делает то, что вы ищете?

function create(text)
{
    var main = function()
    {
        console.log('main');
        console.log(this);
    }
    var init = function()
    {
        console.log('init');
        main.text = text;
    }
    main.method = function()
    {
        console.log(main.text);
    }
    init();
    return main;
}
//the following line will call init
var fun = create('some variables');
//call main
fun();
//call methods
fun.method();
...