1

这是我的 JavaScript 代码:

function animal(){
    var animal_sound;
    this.animal = function(sound){
        animal_sound = sound;
    }

    this.returnSound = function(){
        return animal_sound;
    }
}

function cat(){
    this.cat = function(sound){
        this.animal(sound);
    }
}
cat.prototype = new animal()
cat.prototype.constructor = cat;

//Create the first cat
var cat1 = new cat();
cat1.cat('MIAO');//the sound of the first cat

//Create the second cat
var cat2 = new cat();
cat2.cat('MIAAAAUUUUUU');//the sound of the second cat

alert(cat1.returnSound()+' '+cat2.returnSound());

只是我有cat扩展功能的animal功能。比我创造了两只不同的猫(cat1cat2)。每只猫都有自己的声音,但是当我打印它们的声音时,我得到:

MIAAAAUUUUUU MIAAAAUUUUUU

cat2声音会覆盖cat1声音,我不想要这个。

我想获得:

MIAO MIAAAAUUUUUU

谁能帮我?

4

2 回答 2

0

那是因为您正在设置原型

cat.prototype = new animal()

每个动物实例都有自己的“私有”animal_sound变量,但所有cat实例都继承自同一个 animal实例,因此它们“共享”这个变量。

animal相反,您应该为每个 cat实例调用:

function cat(){
    animal.call(this);

    this.cat = function(sound){
        this.animal(sound);
    }
}

cat.prototype在这种情况下,您甚至不需要分配任何东西。但是,如果您计划向原型添加方法(您应该这样做),请使用它Object.create来设置继承。更多信息在这里:使用 `Object.create` 进行继承的好处

于 2013-10-06T01:31:36.467 回答
0

和方法在原型上animal().returnSound()因此它们在cat.

因为它们是在构造函数中创建的animal,并且在该构造函数的范围内使用了一个变量,所以每次调用.animal()时,都会覆盖 and 使用的同一个.animal()变量.returnSound()

.animal()为了做你想做的事,你需要.returnSound()为每个cat.


function animal(){
    var animal_sound;
    this.animal = function(sound){
        animal_sound = sound;
    }

    this.returnSound = function(){
        return animal_sound;
    }
}

function cat(){
    animal.call(this); // apply the `animal()` function to the new `cat` object
    this.cat = function(sound){
        this.animal(sound);
    }
}
cat.prototype = new animal()
cat.prototype.constructor = cat;

现在,当您创建猫时,它们将拥有自己的.animal().returnSound()方法,这些方法将在animalfor each的单独调用中创建cat,因此animal_sound每对方法都会有一个新方法。

var cat1 = new cat();
cat1.cat('MIAO');

var cat2 = new cat();
cat2.cat('MIAAAAUUUUUU');

alert(cat1.returnSound()+' '+cat2.returnSound()); // MIAO MIAAAAUUUUUU

当然,在这样做时,您并没有充分利用原型继承。

于 2013-10-06T01:31:50.767 回答