2017-09-20 10 views
-1

これは私の最初の質問ですので、正しく処理していない可能性があります。私はJSとノードJSを学ぼうとしています。私はutil.inherits関数に苦労しています。コンストラクタがスーパーコンストラクタのメソッドを継承しないのはなぜですか?

util.inherits関数を使用しても、ヒューマンコンストラクタのプロパティとメソッドが男性のインスタンスで使用できない理由を理解できないようです。 james instance of Humanが本当に戻ってくるので、確かにjamesオブジェクトはHumanメソッドにアクセスする必要があります。

私は、util.inheritsの使用は現在はお勧めできませんが、私の理解を深めてくれない理由を理解したいと思います。

var util = require('util'); 

function Human(){ 
    this.firstName = 'James'; 
    this.secondName = 'Michael'; 
    this.age = 8; 
    this.humanFunction = function(){ 
     console.log('I am a human'); 
    } 
} 

function Male(){ 
    this.gender = 'male'; 
    this.power = 5; 
    this.who = function(){ 
     return 'I am Male'; 
    }; 
} 

util.inherits(Male, Human) 

let james = new Male(); 

console.log(james instanceof Human); //true 
console.log(james.firstName); //undefined 
james.humanFunction(); //james.humanFunction is not a function 
+1

質問:なぜ自動的にこれを行うことができるJavaScriptクラスを使用するのではなく、「util」というパッケージを使用していますか? –

+2

'Male'コンストラクタの最初の行に' Human.call(this); 'を追加します。 – 4castle

+0

@ Mike'Pomax'Kamermans私はクラスを知っていて、彼らがすでにこの機能を行っていることを知っています。ここで私の理解に間違いがあるかどうかだけを尋ねるだけで、クラスを使ってこれを行うことができたとしても、それがutil.inheritsを使用していない理由を理解したいと思います。 –

答えて

0

It's 2017、Node.js tells you not to use thisです。代わりに、実際のクラスの表記を使用します。

// our initial class 
class Human { 
    constructor(first, second, age) { 
    this.firstName = first; 
    this.secondName = second; 
    this.age = age; 
    this.gender = 'unspecified' 
    } 

    sayWhat() { 
    console.log(`I am a human, and my gender is ${this.gender}`); 
    } 
} 

// our 'Male' class, a subclass of Human: 
class Male extends Human { 
    constructor(first, second, age) { 
    super(first, second, age) 
    this.gender = 'male'; 
    } 
} 

をそして、我々は同じコードを呼び出すが、文字列のテンプレートとそれはノードの最近のバージョンがやることだからです

let james = new Male('james', 'michael', 8); 
console.log(`is james a human?: ${james instanceof Human}`); 
console.log(`james's first name is: ${james.firstName}`); 
console.log(`james says: ${james.sayWhat()}`); 
+0

同じことを達成するための代替方法ですが。これは、OPが答えようとしている質問には答えません。彼はなぜコードが機能していないのかを理解したかった。単に代替案を提示し、彼のコードがうまくいかない理由を説明しないことは、この質問の理解のための訪問者や潜在的な訪問者の役に立ちません。彼は継承を達成するための2017年以前の方法をまだ使用しているコードを見つけるでしょう。彼がJavaScriptの道を続けていると仮定すると、あなたの答えはどのように彼を助けますか? – Eladian

+1

この同じ質問の今後の訪問者は、このパターンをもう使用しないことを学んでいます。なぜなら、これは悪いパターンであり、もはや使用すべきではないからです。 JavaScriptを使用し続ける人は、現代のJSで何をすべきかを学ぶのが最も確実です。 –

+0

@Eladianこれは本当です。私は実際になぜコードが今働かないのか理解しています。 –

0

Human.callを追加してください(この); Male()関数内で

var util = require( 'util');

function Human(){ 
    this.firstName = 'James'; 
    this.secondName = 'Michael'; 
    this.age = 8; 
    this.humanFunction = function(){ 
     console.log('I am a human'); 
    } 
} 

function Male(){ 
    this.gender = 'male'; 
    this.power = 5; 
    this.who = function(){ 
     return 'I am Male'; 
    }; 
    Human.call(this); 
} 

util.inherits(Male, Human) 

let james = new Male(); 

console.log(james instanceof Human); //true 
console.log(james.firstName); //undefined 
james.humanFunction(); //james.humanFunction is not a function 
関連する問題