2016-09-09 15 views
0

JavaScriptの継承について混乱しています。Javascript継承との混乱

は、次のコードを考えてみましょう:今すぐ

function parent(firstname, lastname) { 
    this.firstname = firstname || "abc"; 
    this.lastname = lastname || "def"; 
} 

function child() { 
    this.childname = "xys"; 
} 
parent.prototype.Greetings = function() { 
    alert("sayhi"); 
} 
child.prototype = Object.create(parent.prototype); 
var child1 = new child(); 

を、child1オブジェクトがfirstnamelastnameプロパティへのアクセス権を持っていますか? Greetingsメソッドにアクセスできます(プロトタイプに含まれているため)。 これらにアクセスしようとすると、undefinedと表示されます。 これらの変数にアクセスするためにはどのような変更を行う必要がありますか?

+0

注: 'object.create'ではなく' Object.create'です。 –

+0

編集のための@melpomene – Geeky

答えて

0

これらの変数にアクセスするには、どのような変更を行う必要がありますか?あなたは子供のコンストラクタで親コンストラクタを呼び出す必要があり

function child() { 
    parent.call(this); 
    this.childname = "xys"; 
} 

JavaScriptを「継承」でES6クラスの前に(はるかに少ない(暗黙すなわち)魔法の他の言語よりも少なくとも)。

parentの例では、thisに2つのプロパティを設定しています。しかし、あなたのコードのどこにもparentがあるので、これらのプロパティは決して設定されません。

これらを設定するには、新しいchildインスタンスにparentを適用する必要があります。これはparent.call(this);を呼び出して行います。

parentは引数を受け付けますので、あなたはおそらく最終的にchildを介してそれらを渡したい:

function child(firstname, lastname) { 
    parent.call(this, firstname, lastname); 
    this.childname = "xys"; 
} 

関連:これを行うにはBenefits of using `Object.create` for inheritance

+0

このアプローチはコンストラクタスティールと呼ばれていますか? 。継承のために、javascriptでprototypalとconstructor stealingの組み合わせを行うべきです。私が間違っていたら私を修正してください。 – Geeky

+0

@Geeky:私はそれについて聞いたことがありません。しかし、それは他の言語(とES6)で 'super() 'を呼び出すのと同じです。親コンストラクタを呼び出さなければならないのは、継承のための典型的なことです。 –

0

良い方法は、より最近のES2015標準を使用しています。構文ははるかに明確になります。

class Parent { 
    constructor(firstname, lastname) { 
     this.firstname = firstname || "abc"; 
     this.lastname = lastname || "def"; 
    } 
    greetings() { 
     alert("sayhi"); 
    } 
} 

class Child extends Parent { 
    constructor(){ 
     super(firstname, lastname); 
     this.childname = "xys"; 
    } 
} 
var child1 = new child(); 

情報はhttps://babeljs.io/docs/learn-es2015/にあります。 さらに、javascriptでのクラス宣言の詳細については、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classesを参照してください。

+0

これは動作しません。子コンストラクタで 'super(this)'を呼び出さなければなりません。 –

+0

本当に、私は 'スーパー(これ) 'を忘れていました。私は答えを更新しました。 –

+0

は 'コンストラクタ(ファーストネーム、ラストネーム){ スーパー(ファーストネーム、ラストネーム)' – marzelin

関連する問題