我想创建一个我可以这样使用的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()
因为我讨厌字符串代码块。
答案 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