Javascript可调用和原型可扩展函数
Javascript Callable and prototype extendable Function
基本上,我在寻找在使用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();
相关文章:
- 如何在不编写样板代码的情况下在Node中创建可重用函数
- 可扩展的画布作为Google Maps Javascript API中的覆盖
- 如何在可扩展ui网格中绑定子网格事件
- setInterval可更改函数的背景
- 为什么我需要为扩展函数设置构造函数
- 如何在Mobx中执行可观察函数
- 带有嵌入脚本的SVG可扩展到浏览器的可用空间
- 扩展函数返回内容的Javascript
- 返回可用作函数的 Javascript 对象
- 我可以在 TypeScript 中扩展函数吗?
- 如何为表构建可扩展的子行(jQuery/Javascript)
- 如何以可扩展和可折叠的树形结构显示XML模式
- 访问可扩展QML应用程序中的列表视图索引
- Angular2/Typescript:从链接可观察函数访问实例变量
- 局部变量仍可通过函数访问
- 未能执行'waitUntil'在'可扩展事件'
- D3中的可重用函数
- 递归可防止函数在一行中被多次单击
- 谷歌浏览器扩展程序 - 单击图标可调用函数
- Javascript可调用和原型可扩展函数