Javascript 原型继承使用Object.create for prototype将[Object]作为实例的原型

Javascript 原型继承使用Object.create for prototype将[Object]作为实例的原型,javascript,Javascript,有人建议Derived.prototype=Object.create(Base.prototype)优于Derived.prototype=new Base()(如中所示) 这是有道理的,但当我使用这种方法时,就像这样: function B(){}; B.prototype.doA = function(){}; function D(){}; D.prototype = Object.create(B.prototype); var d = new D(); console.log(

有人建议
Derived.prototype=Object.create(Base.prototype)优于
Derived.prototype=new Base()(如中所示)

这是有道理的,但当我使用这种方法时,就像这样:

function B(){};
B.prototype.doA = function(){};

function D(){};
D.prototype = Object.create(B.prototype);

var d = new D();

console.log(Object.getPrototypeOf(d)); 
它将
Object{doA:function}
输出到控制台,并记录
console.log(d)
显示带有
\uuuuuuuuuuuuuuu:Object
的对象。为什么它不是
D{doA:function}

其他一切似乎都起作用了:

d.doA();
d instanceOf D; // true
d instanceOf B; // true

这似乎很奇怪。我做错什么了吗?

当您使用
Object.create
方法时,它通常也与构造函数赋值配对

//...
D.prototype = Object.create(B.prototype);
D.prototype.constructor = D;
//...

可能只有
console.log
的古怪之处。尝试设置
D.protype.constructor=D
然后看看输出是否改变。@Bergi,我想你是对的。我在Chrome中尝试了它,它将它改为
D{constructor:function,doA:function}
。IE只是显示[object object]而不考虑。这种“工作”方式,但现在在输出中添加了
构造函数
属性,我猜它总是在那里,但隐藏着。那么,这是控制台工作方式的产物吗?@NewDev-构造函数属性应该始终是函数实例输出的一部分。当您使用Object.create时,它只复制原型,这就是为什么构造函数只是对象。例如,如果您考虑使用
var d=new B()
在fiddle中,您将看到控制台中的日志包含构造函数属性,该属性等于在Chrome中实际没有为我提供的函数位:。但是看到IE根本没有显示任何种类的标识符,这似乎只是一个控制台实现问题。@NewDev-您只是在小提琴中记录对象,这与其他场景不同。这就是为什么它没有出现。