这是我的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
函数。比我创造了两只不同的猫(cat1
和cat2
)。每只猫都有自己的声音但是当我打印它们的声音时我得到了:
MIAAAAUUUUUU MIAAAAUUUUUU
cat2
声音会覆盖cat1
声音,我不希望这样。
我想获得:
MIAO MIAAAAUUUUUU
任何人都可以帮助我吗?
答案 0 :(得分: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
来设置继承。更多信息:Benefits of using `Object.create` for inheritance。
答案 1 :(得分:0)
animal()
和.returnSound()
方法位于原型上,因此它们在cat
的所有实例之间共享。
因为它们是在animal
构造函数中创建的,并且在该构造函数的作用域中使用了一个变量,所以每次调用.animal()
时,都会覆盖.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()
方法,这些方法将在animal
的单独调用中为每个cat
创建,因此每对方法都会有一个新的animal_sound
。
var cat1 = new cat();
cat1.cat('MIAO');
var cat2 = new cat();
cat2.cat('MIAAAAUUUUUU');
alert(cat1.returnSound()+' '+cat2.returnSound()); // MIAO MIAAAAUUUUUU
当然,在这样做的过程中,你并没有充分利用原型继承。