Javascript可调用和原型可扩展函数

Javascript Callable and prototype extendable Function

本文关键字:可扩展 函数 原型 调用 Javascript      更新时间:2023-09-26

基本上,我在寻找在使用javascript原型方法时将方法附加到可执行函数的能力。下面的代码演示了我正在谈论的愿望和我正在寻找的功能,但这确实是一个破解。请注意,我有一个有效的this对象来附加变量以及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,你就不能返回一个单独的值。

任何解释或考虑都很好!

您可以将原型函数放入"构造函数"主体中。从技术上讲,这就是您目前正在做的事情,但显式定义它们而不是使用辅助方法要干净得多。然后,您可以使用以下用于公共和私有变量和方法的模式来进一步简化代码:

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

所谓"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();