使用 JavaScript 函数对象继承

Employing inheritance with JavaScript Function objects

是否可以创建两个或多个 JavaScript 函数对象,它们从一个公共对象继承属性?

var obj common = {
    a: 'first',
    b: 'second',
    z: 'last'
};

var foo = function() {};
var bar = function() {};

// Some magic occurs here

foo.a; // 'first'
bar.z; // 'last'

实现此目的的一种方法是使用 mixin,我们在其中迭代 common 并将属性复制到 foo 和 bar。但是,如果我们有一个巨大的属性列表,这可能会变得低效。

有没有更JavaScript的方法呢?我很想在这里使用原型链,但我不知道是否可行。

无法通过以下方式创建函数:

  • function foo (){ }(函数声明)
  • Function 构造函数
  • var foo = function(){ }(函数表达式)
  • () => {}(ES6 箭头)。

在所有这些中,您不能为函数本身指定基数 class。但是,正如您所指出的,类似 mixin 的技巧在这里就可以正常工作。

请注意,事先可能认为以下方法可能有效:

function f(){
   return Function.apply(this, arguments);
}
f.prototype = Object.create(Function.prototype);
f.x = 15;

但它没有,而且根据规范也没有(即,因为作为函数调用的函数构造函数的行为相同 - 即它忽略传入的 this)。

这将完全按照您的要求进行,但我不认为您想要您认为您想要的。如果你明白我的意思?!

这需要现代 Chrome 或 FF:

var common = {
    __proto__: Function.prototype,
    a: 'first',
    b: 'second',
    z: 'last'
};

var foo = function() {};
var bar = function() {};

Object.setPrototypeOf(foo, common);
Object.setPrototypeOf(bar, common);

console.log(foo.a); // 'first'
console.log(bar.z); // 'last'

我想你想要的是这个:

var common = {      
  a: 'first',
  b: 'second',
  z: 'last'
};

var Foo = function() {};
var Bar = function() {};

Foo.prototype = Bar.prototype = common;

var foo = new Foo();
var bar=  new Bar();

console.log(foo.a); // 'first'
console.log(bar.z); // 'last'