gpt4 book ai didi

javascript - 为什么 Object.create() 在这种情况下用于原型(prototype)继承?

转载 作者:行者123 更新时间:2023-11-29 16:06:01 24 4
gpt4 key购买 nike

考虑这段代码:-

function Rectangle(length, width) { 
this.length = length;
this.width = width;
}

Rectangle.prototype.getArea = function() {
return this.length * this.width;
};

function Square(size) {
Rectangle.call(this, size, size);
}

Square.prototype = Object.create(Rectangle.prototype);

var rect = new Rectangle(5, 5);
var square = new Square(7);

console.log(rect.getArea()); // 25
console.log(square.getArea()); // 49

为什么我们要这样继承:-

Square.prototype = Object.create(Rectangle.prototype);

不是这样的:-

Square.prototype = Rectangle.prototype;

他们似乎都完成了所需的任务。

最佳答案

设置 Square.prototype = Rectangle.prototype 意味着它们都是相同的对象,这几乎肯定不是您想要的。 Square 是 Rectangle,但 Rectangle 不是 Square,因此行为不会相同。您需要两个不同的原型(prototype)对象。

使用 Object.create() 是一种创建对象的简洁方法,该对象将给定对象(在本例中为 Rectangle.protoype)作为其头部原型(prototype)链。结果是 Square.prototype 是一个不同的对象,可以赋予它自己的属性(适用于正方形但不适用于矩形的特殊方法),但它也可以访问 Rectangle 中的方法原型(prototype)。

因此,当您通过 new Square(100) 创建一个 Square 时,您会得到一个对象,其直接原型(prototype)是使用 Object.create() 创建的对象并且(大概) 装饰着各种有趣的 Square 行为。 那个 对象又将 Rectangle.prototype 作为其原型(prototype)链中的第一件事。其效果是,如果您调用 mysquare.area(),并且 area() 是在 Rectangle 原型(prototype)上定义的,查找将从 Square 开始实例,到 Square 原型(prototype),然后到 Rectangle 原型(prototype),方法将在其中找到。

关于javascript - 为什么 Object.create() 在这种情况下用于原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com