0

这是一些代码

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.prototypePerson.prototype所以如果我们添加到Person.prototype像这样的方法

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

Animal.Prototype 是否也得到doSomethingElsePerson.prototype.

cate.doSomethingElse();
4

2 回答 2

0

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

Person.prototype = Animal.prototype;

然后

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

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

为避免这种情况,您可以使用这样的函数

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

在现代浏览器中,您可以Object.create改用:

Person.prototype = Object.create(Animal.prototype);
于 2013-03-15T04:36:37.093 回答
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

例如,如果您将方法添加到Person.prototype,它不会被以下实例继承Animal

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

typeof p.foo; // function
typeof a.foo; // undefined
于 2013-03-15T05:20:51.070 回答