这是一些代码
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
答案 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;
然后Animal
和Person
共享相同的prototype
对象,并且在分配后构建的Animal
和Person
的所有实例都具有相同的[[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