数据与Javascript中的继承冲突

Data conflict with inheritance in Javascript

本文关键字:继承 冲突 Javascript 数据      更新时间:2023-09-26

我正试图用JavaScript开发一个lib,但我遇到了继承问题。以下是我尝试做的事情的一个简化示例:

Fruit = function () {
    this.colors = [];
}
Lemon = function () {
    this.colors.push("yellow");
}
Lemon.prototype = new Fruit();

在这里,我想创建一个类Lemon,继承自一个类Fruit中,每个水果都包含一个颜色列表。

但当我尝试实例化一些柠檬并像这样打印它们的颜色时:

var lemon1 = new Lemon();
console.log(lemon1.colors);
var lemon2 = new Lemon();
console.log(lemon1.colors);
console.log(lemon2.colors);

我得到这个输出:

["yellow"]
["yellow", "yellow"]
["yellow", "yellow"]

所以我可以看到问题是属性"colors"是Lemon对象的每个实例之间共享的一个数组。

如何为每个柠檬实例制作不同的颜色数组,并在Fruit类中进行定义?

像这样:

Fruit = function () {
    this.colors = [];
}
Lemon = function () {
    Fruit.call(this);
    this.colors.push("yellow");
}
Lemon.prototype = Object.create(Fruit);

Lemon构造函数调用Fruit构造函数:Fruit.call(this);。此外,我们使用Object.create(Fruit)来创建对象,而不是调用构造函数来创建原型。

运行您的示例将给出具有上述定义的以下内容。

> var lemon1 = new Lemon();
> console.log(lemon1.colors);
[ 'yellow' ]
> var lemon2 = new Lemon();
> console.log(lemon1.colors);
[ 'yellow' ]
> console.log(lemon2.colors);
[ 'yellow' ]

我补充道:

> Object.is(lemon1.colors, lemon2.colors)
false

这表明Lemon实例的colors属性值具有不同的Arrays。