javascript继承混淆

时间:2013-03-15 04:29:59

标签: javascript inheritance

这是一些代码

var Animal = function (name,color,sound){
    this.name = name;
    this.color = color;
    this.sound = sound;
}

Animal.prototype.doSomething = function (){
                              alert(this.sound);
}

var cate = new Animal('cate','black','meow');

cat.doSomething(); \\alerts 'meow' 

now i create another constructor function 

var Person = function (name){
    this.name = name;
}

下面我用Animal.prototype初始化了一个Person.prototype

Person.prototype = Animal.prototype;

所以现在我们知道对象被指定为引用Person.prototype = Animal.prototype 会将Animal.prototype分配给Person.prototype,以便我们向Person.prototype添加类似

的方法
Person.prototype.doSomethingElse = function (){
                                   alert("some text to test");
}

Animal.Prototype也获得doSomethingElse的{​​{1}}方法。

Person.prototype

2 个答案:

答案 0 :(得分:0)

在您当前的代码中,两个原型引用都是完全相同的对象。当你说

Person.prototype = Animal.prototype;

然后

Person.prototype === Animal.prototype; // true

因此,您添加到Person.prototype的任何方法也将位于Animal.prototype中(实际上,不是“也”;只有一个对象用作两个构造函数的原型)。

为避免这种情况,您可以使用this之类的功能:

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}
Person.prototype = object(Animal.prototype);

在现代浏览器中,您只需使用Object.create

Person.prototype = Object.create(Animal.prototype);

答案 1 :(得分:0)

如果你这样做,只是为了清理:

function Animal(){}
function Person(){}

Person.prototype = Animal.prototype;

然后AnimalPerson共享相同的prototype对象,并且在分配后构建的AnimalPerson的所有实例都具有相同的[[Prototype]] }。

如果你这样做:

Person.prototype = new Animal();

这将使Person.prototype成为Animal的实例,因此Person的实例将共享Animal.prototype的所有方法,Animal的实例将不会共享Person.prototype的任何拥有属性。

e.g。如果您向Person.prototype添加方法,则Animal的实例不会继承该方法:

Person.prototype.foo = function(){};
var p = new Person();
var a = new Animal();

typeof p.foo; // function
typeof a.foo; // undefined