使用JavaScript函数对象的继承

使用JavaScript函数对象的继承,javascript,inheritance,prototype,prototypal-inheritance,Javascript,Inheritance,Prototype,Prototypal Inheritance,是否可以使两个或多个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,在这里我们迭代comm

是否可以使两个或多个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更好的方法来实现这一点?我很想在这里使用原型链,但我不知道这是否可行。

不可能以以下方式创建函数:

  • 函数foo(){}
    (函数声明)
  • 函数
    构造函数
  • var foo=function(){}
    (函数表达式)
  • ()=>{}
    (ES6箭头)
在所有这些情况下,不能为函数本身指定基类。但是,正如您所注意到的,类似mixin的技巧在这里很有效

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

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

但是它不是,而且它也不是根据规范(也就是说,因为作为函数调用的函数构造函数的行为是相同的-即它忽略传入的
这个

这将完全满足您的需求,但我认为您不需要您认为需要的。如果你知道我的意思

这需要现代铬合金或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'

不,我特别想创建从公共父原型继承的对象,但也可以作为函数应用于参数。非常感谢。如果我没有弄错的话,直接设置proto通常不是一个好主意。这可以通过额外调用Object.setPrototypeOf(common,Function.prototype)来实现吗?另外,看起来Safari中不支持setPrototypeOf。我的回答中的前一种方法与语言的粒度不符,因此它使用了广泛支持的结构/方法。后一种方法更为传统,利用原型链;但他们实现了不同的目标。第二种方法是为函数对象的实例设置原型链,而我想设置函数对象本身的原型链。似乎Javascript编写人员并不打算让程序员这样做。