0

我想要的是这样的:

var fnc = new constructor(); // --> function()...
fnc(); // --> Running main function
fnc.method(); // --> Running method

这样就可以创建新fnc实例,同时在构造函数原型中拥有方法。但是,我似乎无法将构造函数的结果作为函数,因为无论返回子句如何,它似乎都变成了一个对象,导致..

Uncaught TypeError: Property 'fnc' of object [object Object] is not a function 

:(

编辑:添加了示例代码。所以我的想法是沿着这些思路。

var constructor = function() { return function() { console.log('Running main function.') }; };
constructor.prototype.method = function() { console.log('Running method.'); }

var fnc = new constructor();

console.log('constructor: ', constructor);
console.log('fnc:         ', fnc);
console.log('fnc.method:  ', typeof $.method);
console.log('');
fnc();
fnc.method();

在这种情况下,一个人得到...

Uncaught TypeError: Object function () { console.log('Running main function.') } has no method 'method' 

...错误,因为构造函数提供的函数与构造函数本身不同,原型链附加在其上。只是似乎无法解决这个问题。用 jQuery 做了一个版本,比如初始化,这很好,但我后来发现它最终是通过空函数原型来完成的,这意味着每个函数都有方法。

4

3 回答 3

2

您不能从构造函数实例创建可调用对象。

您可以有一个函数,该函数返回一个可调用的函数,该函数具有分配给它的方法:

function foo() {
    function fn() {
        ..do stuff..
    }
    fn.method = function () {
        ..do more stuff..
    };
    return fn;
}
var bar = foo();
bar(); //does stuff
bar.method(); //does more stuff

您甚至可以将函数作为构造函数调用,但实际上与直接将函数作为函数调用相同,而不是构造类的新实例:

var baz = new foo();
baz(); //does stuff
baz.method(); //does more stuff
baz instanceof foo; //false
于 2013-08-15T13:02:18.933 回答
-2
function Constructor(n,s,r) {
this.var1 = n;
this.var2 = s;
this.var3 = r;
}

var fnc = new Constructor("Hi", 3, 6);

fnc.prototype.myMethod = function() {
console.log (this.var1);
}
于 2013-08-15T13:05:23.870 回答
-2

您可以专门为这样的对象创建方法

function myObject(name)
{
   this.name = name;
}

myObject.prototype =
{
   getName: function()
   {
      console.log("Name is: " + this.name);
      return this.name;
   }
}

var newObj = myObject("javascript");
var objname = newObj.getName();
console.log("Name is again: " + objname);
于 2013-08-15T13:34:41.303 回答