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;
}

以下では、Person.prototype を Animal.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メソッドを取得しPerson.prototypeます。

cate.doSomethingElse();
4

2 に答える 2

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 に答える
0

現在のコードでは、両方のプロトタイプ参照はまったく同じオブジェクトです。あなたが言う時

Person.prototype = Animal.prototype;

それから

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

したがって、追加するすべてのメソッドPerson.prototypeも含まれますAnimal.prototype(実際には、「また」ではありません。両方のコンストラクターのプロトタイプとして機能するオブジェクトは 1 つだけです)。

これを回避するには、次のような関数を使用できます。

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 に答える