如何创建Javascript Function类的子类?

时间:2010-01-27 17:33:42

标签: javascript inheritance function oop

我想创建一个我可以这样使用的Javascript类:

var f = new myFunction(arg1, arg2);
f.arg1; // -> whatever was passed as arg1 in the constructor
f();
f instanceof myFunction // -> true
typeof f // -> function

我可以将它视为普通对象,甚至将原生Function对象添加到原型链中,但我不能将其称为函数:

function myFunction(arg1, arg2) {
  this.arg1 = arg1;
  this.arg2 = arg2;
}
myFunction.prototype = Function
var f = new myFunction(arg1, arg2); // ok
f.arg1; // ok
f(); // TypeError: f is not a function, it is object.
f instanceof myFunction // -> true
typeof f // -> object

我可以让构造函数返回一个函数,但是它不是myFunction的实例:

function myFunction(arg1, arg2) {
  var anonFunction = function() {
  };
  anonFunction.arg1 = arg1;
  anonFunction.arg2 = arg2;
  return anonFunction;
}
var f = new myFunction(arg1, arg2); // ok
f.arg1; // ok
f(); // ok
f instanceof myFunction // -> false
typeof f // -> function

有什么建议吗?我应该补充一点,我真的想避免使用new Function()因为我讨厌字符串代码块。

5 个答案:

答案 0 :(得分:1)

function Foo() { var o = function() {return "FOO"}; o.__proto__ = Foo.prototype; return o; }

(new Foo()) instanceof Foo:true

(new Foo())():FOO

答案 1 :(得分:1)

首先,你可能应该考虑其他一些方法,因为它不太可能是便携式的。我只是假设我的答案是犀牛。

其次,我不知道Javascript在构造后分配函数体的方法。在构造对象时始终指定正文:

// Normal function definitions
function doSomething() { return 3 };
var doSomethingElse = function() { return 6; };

// Creates an anonymous function with an empty body
var doSomethingWeird = new Function;

现在,每个对象都有__proto__属性形式的非标准Mozilla扩展。这允许您更改任何对象的继承链。您可以将它应用于您的函数对象,以便在构造后为其提供不同的原型:

// Let's define a simple prototype for our special set of functions:
var OddFunction = {
  foobar: 3
};

// Now we want a real function with this prototype as it's parent.
// Create a regular function first:
var doSomething = function() {
  return: 9;
};

// And then, change it's prototype
doSomething.__proto__ = OddFunction;

// It now has the 'foobar' attribute!
doSomething.foobar;  // => 3
// And is still callable too!
doSomething();  // => 9

// And some of the output from your example:
doSomething instanceof OddFunction;  // => true
typeof doSomething;  // => function

答案 2 :(得分:0)

这是不可能的。如果它应该是你的函数的一个实例,那么它必须是一个对象。你为什么要这个?

答案 3 :(得分:0)

我不知道你为什么要做这样的事情。但这是一个接近的片段,

function MyFunction(arg1, arg2)
{
    this.firstProp = arg1;
    this.secondProp = arg2;
}

var f = function(arg1, arg2) {
    return new MyFunction(arg1, arg2);
}(12,13);

alert("Arg1 " + f.firstProp) // 12;

alert("Arg2 " + f.secondProp) // 13;

alert(f instanceof MyFunction) // true;

答案 4 :(得分:0)

以下是我认为更符合你想要的javascript方式,除了它不使用instanceof作为对象而是使用内部对象。

var f = function(arg1, arg2){
    return {
        instanceOf:arguments.callee,
        arg1:arg1,
        arg2:arg2
    };
};
var fn = f(1, function(p){ alert(p); });
fn.arg1; // 1
fn.instanceOf === f; //true
typeof f; //function
typeof fn; //object
fn.arg2('hello'); //show alert hello