是否可以从javascript函数对象继承

Is it possible to inherit from javascript Function object?

本文关键字:函数 对象 继承 javascript 是否      更新时间:2023-09-26

是否可以用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