1

クラスのすべてのメソッドに「プロトタイプ」を追加する必要があります。または、以下の例では名前空間で十分です(完全な例については、以下のリンクを参照してください)。私はそれが良い習慣であることを理解していますが、継承は本当にすべてのメソッドでキーワード「プロトタイプ」宣言を必要としますか..本当の必要性の継承は何ですか

if(animal === undefined) var animal  = {};

animal.Mammal.prototype.haveABaby=function(){ 
    var newBaby=new Mammal("Baby "+this.name);
    this.offspring.push(newBaby);
    return newBaby;
} 
animal.Mammal.prototype.toString=function(){ 
    return '[Mammal "'+this.name+'"]';
} 

http://phrogz.net/JS/classes/OOPinJS2.html

4

2 に答える 2

2

プロトタイプは名前空間とは何の関係もありません。

new Mammal()で作成されたすべてのオブジェクトがこの関数(メソッド)を持つように、プロトタイプで関数を定義します。

Mammal.prototype.haveABaby=function(){
...

var phoque = new Mammal();
var d = phoque.haveABaby();

この場合、すべてのインスタンスが同じ機能を共有します。インスタンスで関数を定義した場合は、より多くのメモリを使用し(必ずしも重要ではない)、インスタンスの作成に時間がかかります。

必要に応じて、名前空間と組み合わせることができます。

animal = animal || {}; // note the simplification
animal.Mammal.prototype.haveABaby=function(){ 
...
var phoque = new animal.Mammal();
var d = phoque.haveABaby();

しかし、これらは2つの異なるトピックです。

これは、プロトタイプと継承の間のリンクの良い説明です。

于 2012-10-01T18:07:23.750 に答える
1

必要です。

プロトタイプがない場合、関数は現在のインスタンスにのみ追加されます。プロトタイプを使用すると、新しいキーワードを使用すると、新しいオブジェクトも関数のコピーを取得します。

すなわち:

Mammal.toString = function() {...};

toString関数を Mammal に配置しますが、 toString 関数をMammalすべてインスタンスに配置するわけではありません。たとえば、上記の非プロトタイプ宣言を使用すると、次のようになります。

var aDog = new Mammal();
aDog.toString()  //result in undefined
于 2012-10-01T18:10:29.477 に答える