Object.assign 似乎不适用于 Function.prototype
Object.assign doesn't seem to work with Function.prototype
正在尝试为库中的复杂功能创建混合。
这对我有用:
const proto = Object.create(Function.prototype);
但现在我需要做一些多重继承,这样一个对象就可以同时继承函数原型和事件发射器原型,所以我想这样做:
const EE = require('events');
const proto = Object.create(Object.assign({}, EE.prototype, Function.prototype));
但这并没有像预期的那样工作。
然后我试了这个:
const proto = Object.assign({}, Function.prototype);
这表明由于某种原因 Function.prototype 没有被复制,我的观察是否正确?为什么会这样?
每个部分 19.2.4.3 of the ES6 spec,Function.prototype
的属性不可枚举,Object.assign()
仅复制可枚举的属性。这解释了为什么您的副本最终为空,因为 Object.assign()
没有看到任何不可枚举的属性,因此没有复制它们。
因此,如果要复制属性,则必须使用不同的内容获取属性。 Object.create()
可能是最好的方法,因为它就是为此而设计的。
@jrfiend00 可能是对的。看起来我能够实现我想做的事情,就像这样:
const $proto = Object.create(Function.prototype);
const proto = Object.assign($proto, EE.prototype);
两步混合。
通常情况下,我希望能够做到这一点:
const proto = Object.assign({}, EE.prototype, Function.prototype);
但这不起作用,很可能是由于 jfriend00 指定的原因。不确定为什么规范允许 Object.create 为此工作。
正在尝试为库中的复杂功能创建混合。
这对我有用:
const proto = Object.create(Function.prototype);
但现在我需要做一些多重继承,这样一个对象就可以同时继承函数原型和事件发射器原型,所以我想这样做:
const EE = require('events');
const proto = Object.create(Object.assign({}, EE.prototype, Function.prototype));
但这并没有像预期的那样工作。
然后我试了这个:
const proto = Object.assign({}, Function.prototype);
这表明由于某种原因 Function.prototype 没有被复制,我的观察是否正确?为什么会这样?
每个部分 19.2.4.3 of the ES6 spec,Function.prototype
的属性不可枚举,Object.assign()
仅复制可枚举的属性。这解释了为什么您的副本最终为空,因为 Object.assign()
没有看到任何不可枚举的属性,因此没有复制它们。
因此,如果要复制属性,则必须使用不同的内容获取属性。 Object.create()
可能是最好的方法,因为它就是为此而设计的。
@jrfiend00 可能是对的。看起来我能够实现我想做的事情,就像这样:
const $proto = Object.create(Function.prototype);
const proto = Object.assign($proto, EE.prototype);
两步混合。
通常情况下,我希望能够做到这一点:
const proto = Object.assign({}, EE.prototype, Function.prototype);
但这不起作用,很可能是由于 jfriend00 指定的原因。不确定为什么规范允许 Object.create 为此工作。