您能解释一下这两个代码片段之间的区别吗?
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);
这是我在这个平台上的第一个问题。如有错误,敬请见谅。我无法理解这两个代码片段之间的区别。我收到这些错误,但我无法理解原因。
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);