2016-05-30 4 views
-1

私は保守的なOOP言語(Java)から来て、実際にはJavascriptの継承を理解していません。私もプロトタイプ全体のコンセプトで揺れ動いていますが、私は、私の必要性に答える例であるhereを見ましたが、詳細を理解していないし、なぜ物事が異なって行われないのか分かりません。その例にとるJavascriptプロトタイプと継承

は、

function Animal(name) { 
    this.name = name; 
} 

// Example method on the Animal object 
Animal.prototype.getName = function() { 
    return this.name; 
} 

function Mammal(name, hasHair) { 
    // Use the parent constructor and set the correct `this` 
    Animal.call(this, name); 

    this.hasHair = hasHair; 
} 

// Inherit the Animal prototype 
Mammal.prototype = Object.create(Animal.prototype); 
// Set the Mammal constructor to 'Mammal' 
Mammal.prototype.constructor = Mammal; 

を次のように正しい実装である私はObject.call()関数の目的を理解していないにも私は単にObject.createは()を使用した理由を理解していませんちょうどAnimal.prototype。また、なぜ最後の行にコンストラクタが追加されていますか?それは前のステップで消去されているのでしょうか?すべてのMammalインスタンスでコードを共有したい場合はどうすればよいですか?あなたがMammal.prototype.constructor = Mammal;を呼び出していない場合は、事前

+0

:ここ

は良いアドバイスですメソッドを呼び出すときは直接呼び出します。それ以外の場合、 'this'はメソッドの呼び出しコンテキスト(メソッドが呼び出されたオブジェクト)によって決定されます。 – rand

答えて

0

おかげで、その後、コンストラクタは(デフォルトではAnimal.prototypeのコンストラクタです)アニマル()

だろうObject.create()を使用すると、Mammal.prototypeがないことを意味参照をAnimal.prototypeに変換する代わりに、そのプロトタイプを継承する新しいオブジェクトです。

Object.call()を使用すると、スコープはメソッドを呼び出す関数のスコープではなく、代わりにMammalコンストラクタのスコープになります。

0

JavaはJavaのようにクラスを拡張できません。あなたはそのようなものだけをシミュレートすることができます。

Animal.call動物を確認してください。これは動物を指していませんが、Mammalを指しています。要するに、call()関数は@thisを上書きします。

object.createは単にプロトタイプとして指定されたオブジェクトと空の関数のインスタンスを作成する:子constuctorを使用する場合にのみ必要

Object.create = function (o) { 
    function F() {}; 
    F.prototype = o; 
    return new F(); 
} 

そのします。そうでなければ、単純なオブジェクトも同様にそれを行います。メソッド `call`、` apply`と `Object`プロトタイプの` bind`は `this`を設定する唯一の方法です。ご質問のいずれかを答えるために http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/

+0

これでES6を使用できます。 –

+0

es6は一般的ではありません。https://kangax.github.io/compat-table/es6 – Steffomio

関連する問題