Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的数据与继承冲突_Javascript_Inheritance - Fatal编程技术网

Javascript中的数据与继承冲突

Javascript中的数据与继承冲突,javascript,inheritance,Javascript,Inheritance,我正在尝试使用JavaScript编写一个库,但我遇到了一个继承问题。下面是一个我正在尝试做的简化示例: Fruit = function () { this.colors = []; } Lemon = function () { this.colors.push("yellow"); } Lemon.prototype = new Fruit(); 在这里,我想创建一个Lemon类,继承自一个水果类,每个水果都包含一个颜色列表 但当我尝试实例化一些柠檬并像这样打印它们的

我正在尝试使用JavaScript编写一个库,但我遇到了一个继承问题。下面是一个我正在尝试做的简化示例:

Fruit = function () {
    this.colors = [];
}

Lemon = function () {
    this.colors.push("yellow");
}

Lemon.prototype = new Fruit();
在这里,我想创建一个Lemon类,继承自一个水果类,每个水果都包含一个颜色列表

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

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类中的定义为每个lemon实例创建不同的颜色数组?

如下所示:

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
属性的值具有不同的
Array
s