gpt4 book ai didi

Javascript 可调用和原型(prototype)可扩展函数

转载 作者:行者123 更新时间:2023-11-30 06:04:01 25 4
gpt4 key购买 nike

基本上,我希望能够在使用 javascript 原型(prototype)方法时将方法附加到可执行函数。下面的代码演示了我正在谈论的需求和我正在寻找的功能,但它确实是一个 hack。请注意,我有一个有效的 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();

恐怕我可能遗漏了一些明显的东西。

这里的功能与上面相同,但是扩展了全局函数原型(prototype)。

扩展全局属性是不好的做法,所以我正在寻找替代解决方案。

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 对象方法,因为如果您调用 new,则无法返回单独的值。

任何解释或考虑都会很棒!

最佳答案

您可以将原型(prototype)函数放入“构造函数”主体中。从技术上讲,这就是您当前正在做的事情,但是明确定义它们而不是使用辅助方法要清晰得多。然后,您可以对公共(public)和私有(private)变量和方法使用以下模式进一步简化您的代码:

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 可调用和原型(prototype)可扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com