2016-10-30 10 views
0
var A = function() { 
    this.p1 = 2; 
}; 
A.prototype.f1 = function() { 
    return 7; 
}; 
var B = function() { 
    inherit(A, B); 
}; 


function inherit(Child, Parent) { 
    Child.prototype = Object.create(Parent.prototype); 
    Child.prototype.constructor = Child; 
} 

var b = new B(); 
console.log(b.p1); // get undefined here 

私はJSの新機能です。ダンプに関するご質問は申し訳ありません。私はBAから継承したいと思います。私は間違って何をしていますか?JavaScript:ECMAScript5の継承

答えて

1

私は間違っていますか?

2つのこと:

  1. あなたはB内部inheritを呼んでいます。あなたは外でそれをしなければなりません。

  2. Bの中には、Aと呼びます。

    A.call(this/*, other, args, here, if, needed*/); 
    

    又は

    A.apply(this, arguments); 
    

    自動arguments擬似アレイを介して実行時に受信Bすべての引数に渡します。そのよう

var A = function() { 
 
    this.p1 = 2; 
 
}; 
 
A.prototype.f1 = function() { 
 
    return 7; 
 
}; 
 
var B = function() { 
 
    A.call(this);  // <==== Added 
 
}; 
 
inherit(A, B);   // <==== Moved 
 

 
function inherit(Child, Parent) { 
 
    Child.prototype = Object.create(Parent.prototype); 
 
    Child.prototype.constructor = Child; 
 
} 
 

 
var b = new B(); 
 
console.log(b.p1); // get 2 here now

+0

答えをありがとう! T.J.あなたが 'A.call(this);; –

+0

@Rudziankoŭを呼び出したときに何が起こるかを少数の言葉で説明してください。@Rudziankoŭ:' A.call(x、y、z) 'を実行すると、関数' A' 'A'のコード中の' this 'を 'x'にし、' y'と 'z'を引数として渡すようにします。基本的に 'foo.bar(y、z)'が行うこと( '' bar''を 'foo'とする)を行いますが、オブジェクトのプロパティ式は必要ありません。 [MDNに関する詳細](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call) (そして 'A.apply'は' 'call''とまったく同じですが、引数を渡したい場合は、' '呼び出し' 'のように個々の引数の代わりに配列のようなオブジェクトとして与えます)。 –

2

Bのインスタンスを作成した後で、inherit()と呼んでいるだけです。

inherit()を静的に呼び出す必要があります。

またABと電話する必要があります。

継承を正しく行う方法の詳細については、my blogを参照してください。

+0

*「あなたはまた、Bであなたのインスタンス上で呼び出す必要があります。」*おそらく、それは非自明だとして(だけでなく、些細な* *どうする、ということを行う方法を示すが、それを行う方法を知っていることは自明ではありません)。 (私はリンクがそれをカバーすると確信していますが...) –

1

あなたは基本コンストラクタを呼び出していませんでした。また、クラスを一度継承すれば十分です。

var A = function() { 
 
    this.p1 = 2; 
 
}; 
 
A.prototype.f1 = function() { 
 
    return 7; 
 
}; 
 
var B = function() { 
 
    A.apply(this, arguments); 
 
}; 
 
inherit(A, B); 
 

 
function inherit(Child, Parent) { 
 
    Child.prototype = Object.create(Parent.prototype); 
 
    Child.prototype.constructor = Child; 
 
    
 
} 
 

 
var b = new B(); 
 
console.log(b.p1); // get undefined here