使用JavaScript函数对象继承

时间:2015-04-16 15:12:07

标签: 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,我们遍历common并将属性复制到foo和bar。但是,如果我们有大量的属性,这可能会效率低下。

有更多的JavaScript方式吗?我很想在这里使用原型链,但我不知道它是否可能。

2 个答案:

答案 0 :(得分:1)

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

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

在所有这些中,您无法为函数本身指定基类。然而,就像你注意到的那样,像mix一样的技巧在这里工作得很好。

请注意,事先可能会认为以下情况可能有效:

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

但它没有,并且根据规范它也没有(即,因为被称为函数的函数构造函数表现相同 - 即它忽略传入的this)。

答案 1 :(得分:1)

这将完全符合你的要求,但我不认为你想要你想要的东西。如果你知道我的意思吗?!

这需要现代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'