Javascript Object.create(父对象)与Object.create(父对象.prototype)

Javascript Object.create(父对象)与Object.create(父对象.prototype),javascript,object,inheritance,Javascript,Object,Inheritance,我的问题是关于javascript中的继承。所以当你有 child.prototype = Object.create(parent.prototype) 您正在将子类的原型设置为父类原型的副本。如果在控制台中进行检查,则子类的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性将直接显示\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。到现在为止,一直都还不错。但当你这样继承遗产时- child.prototype = Objec

我的问题是关于javascript中的继承。所以当你有

child.prototype = Object.create(parent.prototype) 
您正在将子类的原型设置为父类原型的副本。如果在控制台中进行检查,则子类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性将直接显示
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。到现在为止,一直都还不错。但当你这样继承遗产时-

child.prototype = Object.create(parent) 

子函数的
\uuuuuu proto\uuuuu
属性显示
\uuuuu proto\uuuuuu:function parent()
,此函数具有属性prototype,其键值为
prototype:parent
。两种情况的作用相同。显然,编译器只需再多走一步就可以在原型中找到函数。虽然存在某种差异,但是否如此显著,因此首选
对象。创建(父级。原型)
。有人能简单地解释一下吗?

javascript中最令人困惑的陷阱之一是
。原型和“原型”是不同的东西。在您的示例中,第一个对象的属性通过
parent.prototype
解析,而第二个对象使用“parent's prototype”aka
parent.\uuuuuu proto
。考虑:

function parent() {};

var a = Object.create(parent.prototype); 
var b = Object.create(parent);
这是此代码的继承关系图:


正如您所看到的,
a
b
的原型链是完全不同的。

第一个是错误的。继承是一种反模式。我知道它是错误的,但它是有效的。有人能说出为什么这是错误的吗?“两者的行为都是一样的。”-没有。尝试调用从
父级.prototype
继承的方法。在我的演示中,父级只有一些“私有”属性。我猜在创建对象时不能将函数作为子对象的属性调用。创建(父对象)时不使用原型?请使用
[[prototype]]
而不是
\uuuuuuuuu
?后者是继承自
Object.prototype
的访问器属性,前者是您所指的内部插槽。如果将大型对象命名为“Function.prototype”和“Object.prototype”,可能会有所帮助。顺便说一句,那是什么图表编辑器?非常好的图表。我提到了继承,比如函数a(){},然后是a.prototype=Object.create(parent.prototype),但我猜你也得到了同样的东西——对象的新副本?因此,在您的示例中,您正在创建一个对象,也称为对prototype或direct函数的引用,在我的示例中,我说的“property a.prototype”是对该parent.prototype的引用。另一个问题右上角的是什么?某种函数包装器?@Danielpetrov:你能用一些示例代码更新你的问题吗,因为我真的不明白…@Danielpetrov:我没有画这个图,它是由浏览器生成的,所以浏览器就是这样看待你的对象的。