Javascript函数通过原型方法

时间:2013-08-15 12:57:03

标签: javascript prototypal-inheritance

我想拥有的是这样的:

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

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

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像初始化,它做了诀窍好,但我后来发现它最终通过空函数原型来完成它,这意味着每个函数都得到了方法。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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);
}

答案 2 :(得分:-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);