Javascript 为什么结果不是我所期望的?

Javascript 为什么结果不是我所期望的?,javascript,Javascript,我正在将这个代码片段复制到Chrome的控制台中 函数F(){}; F.prototype.fMethod=函数WOT(){console.log(this)}; 函数G(){}; setPrototypeOf(G.prototype,{…F.prototype.fMethod,…Object.prototype}) log(Object.getPrototypeOf(G.prototype))除了不清楚您想要实现什么之外,我们最接近您想要实现的可能是: 函数F(){}; F.prototy

我正在将这个代码片段复制到Chrome的控制台中

函数F(){};
F.prototype.fMethod=函数WOT(){console.log(this)};
函数G(){};
setPrototypeOf(G.prototype,{…F.prototype.fMethod,…Object.prototype})

log(Object.getPrototypeOf(G.prototype))除了不清楚您想要实现什么之外,我们最接近您想要实现的可能是:

函数F(){};
F.prototype.fMethod=函数WOT(){console.log(this)};
函数G(){};
console.log(Object.prototype);
setPrototypeOf(G,{…F.prototype,
//因为Object.prototype是一个空对象,所以下一行是不相关的
…对象。原型
});
log(Object.getPrototypeOf(G))在线上

Object.setPrototypeOf(G.prototype,{…F.prototype.fMethod,…Object.prototype})

您正在将
G.prototype
的原型设置为空对象,因为

//您正在解包两个对象
{
…F.prototype.fMethod,//是您的WOT函数,它没有可解压缩的自有属性
…Object.prototype//这是一个空对象
}

您正在尝试执行
Function.prototype.method=Function(){console.log(this)}
?你为什么要这么做?你不应该使用
\uuuuuu proto\uuuuu
@slebetman我试图I)首先确认单继承的含义(我读到JavaScript就是这么做的)和ii)如果我对单继承的理解是正确的,我试图通过制作
函数来“打破”它。原型。原型指向一个包含2个
构造函数的对象。原型
s-1来自
object
,另一个来自
F
@tonitone120我刚刚看到了这个问题-我不确定你最初问的是什么,但在修订版中,似乎您误解了object spread符号的作用。将空对象视为输出的原因是,正在扩展的两个对象(未添加特殊属性的函数对象和
对象.prototype
)都没有可枚举属性。这只是因为扩展语法(
)只提供了可枚举属性。这不是我非常熟悉的领域,我不能给你任何明确的参考,但我的理解是,
…obj
迭代
obj
到(在本例中)将其键和值添加到被定义的对象中-但是迭代对象的默认行为是忽略不可删除的属性。不一定要实现某些目标,只想知道为什么我得到的结果与我期望的结果不同。很难说为什么一个明显为空的对象与您期望的不同不知道你期望的是什么@tonitone120。我可以说,您的结果显然是一个空对象,因为您正在合并两个空对象:
…F.prototype.fMethod
(作为对象访问的函数将作为一个空对象)和
…object.prototype
,这是一个空对象。我认为您有点击中了目标。(我想)我现在唯一学到的是没有可枚举属性的对象(来自
\uuuu proto\uuu
?)显示为空。例如,对我的代码稍作更改(添加
F.prototype.fMethod.color=“red”
)会显示此
color
属性。这是因为
Object.setPrototypeOf
的第二个参数只接受“自己的”属性吗?不@tonitone120,它接受对象的原样,在代码中去掉不可枚举属性的是对象的分解:
…Object.prototype
谢谢@AlessandroChitolina。所以我从这里得到的是Object的第二个参数。setPrototypeOf()只“计算”自己的属性?不,
setPrototypeOf
的第二个参数接受传递的整个对象。问题是,您正在使用spread操作符将一个函数(没有可枚举属性)解包到一个新对象中。关于你的问题的第二个论点与
{}
相同。如果希望G继承F(使用fMethod),可能必须使用
Object.setPrototypeOf(G.prototype,F.prototype)
或将其声明为
类G扩展F{}