用原型扩展另一个函数的函数

时间:2013-10-06 01:21:38

标签: javascript function class object prototype

这是我的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

任何人都可以帮助我吗?

2 个答案:

答案 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

当然,在这样做的过程中,你并没有充分利用原型继承。