是否可以从javascript函数对象继承
Is it possible to inherit from javascript Function object?
是否可以用javascript实现我自己的函数?使用__invoke魔术方法来拥有类似php对象的javascript对象?
A = function(){};
A.prototype = new Function();
var a = new A();
alert( a instanceof Function ); // true
a(); // exception
无法回答我自己的问题。。。有一个答案:
很抱歉总是这样,但我已经找到了完成任务的好方法(当发布问题时,我离答案只有几步之遥)。我不删除问题,希望有人能比我花更少的时间。
A = function()
{
var f = function() { alert( 'f called' ) };
f.__proto__ = A.prototype;
return f;
};
A.prototype = Function( );
A.prototype.method = function() { alert( 'method called' ) };
var a = new A();
alert( a instanceof Function ); // true
alert( a instanceof A ); // true
a(); // f called
a.method(); // method called
如果是新手的问题,请给我发电子邮件,我会删除它。谢谢!
这个怎么样:
function MyFunction ( f ) {
_.extend( f, MyFunction.prototype );
return f;
};
MyFunction.prototype.method = function () {
alert( 'method called' );
};
var func = MyFunction( function () {
alert( 'function called' );
});
现场演示:http://jsfiddle.net/nZczW/
因此,您可以通过将自定义函数传递给自定义函数构造函数来创建自定义函数:
var func = MyFunction( function () {...} );
方法(通常)在构造函数的原型上定义:
MyFunction.prototype.foo = function () {...};
在构造函数内部,方法直接分配给函数本身。(我使用了下划线.js的_.extend()
)。因此,您的函数仍然直接继承自Function.prototype
。
你当然可以简化这个模式:
var methods = { /* hash of methods */ };
var func = _.extend( function () { ... }, methods );
这不是很好吗?不幸的是,没有什么好办法。
正如您可能已经注意到的那样,问题是将函数设置为构造函数的prototype
,然后用new
调用构造函数会导致一个简单的旧对象,而不是一个可调用的函数对象。
有一种可能的半变通方法,这取决于你需要它做什么。这是一个有趣的技巧,但对于现实世界的使用来说可能不是一个好主意。您可以创建一个iframe并从iframe的窗口获取Function
。现在你有了Function
的"副本",你可以做任何你想做的事情,而不会破坏你"真正的"Function
函数。
var frame = document.createElement('iframe');
frame.id = frame.name = 'hacks';
frame.style.zIndex = '-1';
document.appendChild(frame);
var MyFunction = frames['hacks'].Function;
// add stuff to MyFunction and MyFunction.prototype
相关文章:
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 访问函数对象的上下文属性|如何
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 如何将函数对象从javascript传递到Polymer元素
- 为什么函数对象的实例没有继承函数原型属性
- 为什么我会从 JavaScript 函数返回一个命名函数(对象)
- 为什么实例构造函数指向最上面的函数构造函数对象
- 使用object.freeze()扩展函数对象-can't添加字段
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- 为什么茉莉花间谍不't通过引用解析函数对象
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 在 JavaScript 中为函数对象添加别名
- 在 Express JS 中从路由调用函数对象
- 函数对象的名称属性是什么
- 构造函数对象
- 节点.js - 从另一个函数/对象发出事件
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 函数对象__proto__和原型属性
- 类仿真 - 模块模式与函数对象