我从Object.create()
上的MDN文章中获取了以下代码,以了解相同的内容。
// Shape - superclass
function Shape() {
this.x = 0;
this.y = 0;
}
function Rectangle() {
Shape.call(this);
}
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log(rect.y);
我评论了以下两行,仍然按预期工作。那么Object.create()
方法在这段代码中有什么意义呢?为什么在示例中演示了这种方法?
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
答案 0 :(得分:4)
此声明使Rectangle
原型成为继承自Shape
原型的新对象。由于rect
继承自Rectangle
的原型(因为它是使用new Rectangle()
构建的),这意味着rect
间接从Shape
&#继承39; s原型。
但是,你问题中的代码实际上没有为Shape
的原型分配任何东西,所以它会运行得很好而不会这样做,使代码有点......愚蠢。它演示了该技术而没有证明该技术的目的。 1
将此添加到示例中会改变:
Shape.prototype.getPosition = function getPosition() {
return [this.x, this.y];
};
然后,rect.getPosition()
会返回[0, 0]
,因为rect
继承了Rectangle
原型的方法,后者又从{{1}继承了它原型。
1 正如评论中所指出的,您的问题中的代码省略了原始代码示例的一部分,这些部分确实说明了为什么您将从另一个继承一个原型对象。删除部分样本可能会使样本无效,这似乎就是这里发生的事情。
答案 1 :(得分:0)
事实上在这个MDN示例中,Rectangle
的原型是一个继承自Shape
原型的新对象。
仅仅因为rect
原型Rectangle
的继承而实际rect
继承自Shape
的原型。
任何事情都没有分配给Shape
的原型,所以它运行并且什么也不做。
举例说明Shape
原型内的方法:
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
然后,rect.move(newX, newY)
将返回一些内容。