带有原型的新功能

new Function with Prototype

在javascript中我们有以下创建对象的方法:

// Prototype Object
var prototype = {
  jump: function() {}
}

// Create person
var person = Object.create(prototype)

我的问题是:有没有办法创建新函数?换句话说:

// Prototype Object
var prototype = {
  jump: function() {}
}

// Create person and somehow define invokation
var person = ?? // e.g.'Function.create(prototype, function() {})'

显然 Function.create 不起作用。我想知道是否有一种本机方法可以执行此操作,而不是创建一个新函数并为其分配一长串方法。函数毕竟是对象,不是吗?如果这在 Javascript 中没有意义,为什么不呢?

** 更新** 为了清楚起见,让我添加以下内容。 person 创建的结果应该是一个 person 函数对象,它是可调用的,但也有原型函数,例如person() 和 person.jump();

f.call.bind(f, null)

应该做你想做的。

更新前答案

你的问题不是很清楚,但我假设你想做的是创建一个具有一组特定功能(由原型定义)的对象,同时为一个或更多这些功能。

我不知道有什么方法可以在一行中做到这一点,但在两行中很容易做到:

// Prototype Object
var prototype = {
  jump: function() { console.log('jump'); }
}

var person = Object.create(prototype);            // Create person
person.jump = function() { console.log('fly'); }; // then define invocation

person.jump(); // outputs 'fly'

如果您有兴趣在 "closure classes" 上重新定义可以访问 "private" 成员的方法,我很确定没有办法做到这一点(如果有的话,那些成员不会'真的不是私人的)。

Post-更新答案

Javascript 没有我知道的内置方法(我怀疑有人会想要它)但是编写自己的方法相当容易:

function FunctionObjectCreate(prototype, mainFunc) {
    Object.keys(prototype).forEach(function(key) {
        mainFunc[key] = prototype[key];
    });
    return mainFunc;
}

var prototype = {
    jump: function() { console.log('jump'); }
};

var person = FunctionObjectCreate(prototype,
                                  function() { console.log('person'); });

person();      // prints 'person'
person.jump(); // prints 'jump'