是否可以创建两个或多个从公共对象继承属性的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方式吗?我很想在这里使用原型链,但我不知道它是否可能。
答案 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'