您能解释一下这两个代码片段之间的区别吗?

Can you explain the differences between these two code snippets?

这是我在这个平台上的第一个问题。如有错误,敬请见谅。我无法理解这两个代码片段之间的区别。我收到这些错误,但我无法理解原因。

Dog should inherit the eat() method from Animal.

beagle should be an instanceof Animal.

beagle.eat() should log "nom nom nom"

function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };

function Dog() { }

// Only change code below this line

Dog.prototype=Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark= function(){
  console.log("Woof!");
}



// Only change code above this line

let beagle = new Dog();
function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };

function Dog() { }

// Only change code below this line

Dog.prototype=Object.create(Animal.prototype);

Dog.prototype={
  constructor:Dog,
  bark:function(){
    console.log("Woof!")
  }
}


// Only change code above this line

let beagle = new Dog();

当你这样做时

Dog.prototype=Object.create(Animal.prototype);

Dog.prototype 对象现在是一个空对象,其 内部原型 指向 Animal.prototype。 (因此,例如,如果 Dog.prototype.eat 被引用,则 eat 属性 在空对象上找不到,因此通过原型继承,解释器查看内部原型对象并找到 eat 在`Animal.prototype)

这就是您要使用的对象。但如果你这样做

Dog.prototype = {
  // object initializer...

现在您要将 Dog.prototype 分配给一个 完全不同的对象 。旧 Object.create(Animal.prototype); 不再是 Dog.prototype 处的对象,因为它的值已完全重新分配。结果,Dog.prototype 处的对象最终没有继承自 Animal.prototype。这就是第二个片段的问题。

如果你想要一个具有这种模式的简洁对象初始化器,你可以使用Object.assign:

function Animal() {}
Animal.prototype.eat = function() {
  console.log("nom nom nom");
};

function Dog() {}

// Only change code below this line

Dog.prototype = Object.assign(
  Object.create(Animal.prototype), {
    constructor: Dog,
    bark: function() {
      console.log("Woof!")
    }
  }
);


// Only change code above this line

let beagle = new Dog();
beagle.eat();
console.log(beagle instanceof Animal);