Javascript 为什么我的构造函数没有继承超级构造函数的方法?

Javascript 为什么我的构造函数没有继承超级构造函数的方法?,javascript,node.js,inheritance,constructor,prototype,Javascript,Node.js,Inheritance,Constructor,Prototype,这是我的第一个问题,所以我可能没有把事情做好。我正在努力学习JS和Node JS。我正在努力使用util.inherits函数 我似乎无法理解为什么人类构造函数的属性和方法对于男性实例不可用,即使我使用了util.inherits函数james人类实例返回为真,因此肯定james对象应该可以访问Human方法 我知道现在不鼓励使用util.inheritsuse,但我想了解为什么它不能进一步提高我的理解 var util = require('util'); function Human ()

这是我的第一个问题,所以我可能没有把事情做好。我正在努力学习JS和Node JS。我正在努力使用util.inherits函数

我似乎无法理解为什么人类构造函数的属性和方法对于男性实例不可用,即使我使用了
util.inherits
函数
james人类实例
返回为真,因此肯定
james
对象应该可以访问
Human
方法

我知道现在不鼓励使用
util.inherits
use,但我想了解为什么它不能进一步提高我的理解

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
2017年,Node.js。相反,请使用实类表示法:

// 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';
  }
}
然后我们调用相同的代码,但是使用字符串模板,因为这是现代版本的Node所做的事情:

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()}`);
2017年,Node.js。相反,请使用实类表示法:

// 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';
  }
}
然后我们调用相同的代码,但是使用字符串模板,因为这是现代版本的Node所做的事情:

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()}`);
请添加Human.call(此);在Male()函数中

var util=require('util')

请添加Human.call(此);在Male()函数中

var util=require('util')



问:为什么要使用名为
util
的包,而不只是使用JavaScript类,这些类可以自动执行此操作?添加
Human.call(this)
到你的
Male
构造函数的第一行。@Mike'Pomax'Kamermans我知道类,并且知道它们已经完成了这个函数。我只想清楚地问一下,我的理解中有一个缺陷,所以即使我可以(事实上应该)使用类来做这件事,我想理解为什么它不能使用util.inherits工作。原因是inherits只将属性从Human.prototype复制到Male.prototype,任何实例属性(使用this关键字定义)不是自动继承的。为此,必须使用Human.call调用超级构造函数(this)@很好,这很有效。问:为什么要使用一个名为
util
的包,而不只是使用JavaScript类,它可以自动执行此操作?添加
Human.call(this)
到你的
Male
构造函数的第一行。@Mike'Pomax'Kamermans我知道类,并且知道它们已经完成了这个函数。我只想清楚地问一下,我的理解中有一个缺陷,所以即使我可以(事实上应该)使用类来做这件事,我想理解为什么它不能使用util.inherits工作。原因是inherits只将属性从Human.prototype复制到Male.prototype,任何实例属性(使用this关键字定义)不是自动继承的。为此,必须使用Human.call调用超级构造函数(this)@很好,这很有效。有什么想法是我应该去了解为什么我需要这样做吗?尽管这是实现同样目标的另一种方法。这并不能回答OP想要回答的问题。他想了解为什么他的代码不起作用。仅仅提供一个替代方案,而不解释为什么他的代码不起作用,无助于他或潜在的访问者更好地理解这个问题。他将遇到仍在使用2017年以前实现继承的方法的代码。假设他继续使用JavaScript,那么你的答案会对他有什么帮助呢?未来的访问者也会学着不再使用这种模式,因为这是一种糟糕的模式,不应该再使用了。任何一个继续使用JavaScript的人都最好学会在现代JS中做什么。@Eladian这是真的。我确实理解为什么代码现在不起作用了。@Mike'Pomax'Kamermans如果我在其他旧代码中遇到它怎么办?“坏模式”是主观的,基于类的方法只是糖衣原型继承。因此,理解原型继承仍然很重要,尽管它是实现同样目标的替代方法。这并不能回答OP想要回答的问题。他想了解为什么他的代码不起作用。仅仅提供一个替代方案,而不解释为什么他的代码不起作用,无助于他或潜在的访问者更好地理解这个问题。他将遇到仍在使用2017年以前实现继承的方法的代码。假设他继续使用JavaScript,那么你的答案会对他有什么帮助呢?未来的访问者也会学着不再使用这种模式,因为这是一种糟糕的模式,不应该再使用了。任何一个继续使用JavaScript的人都最好学会在现代JS中做什么。@Eladian这是真的。我确实理解为什么代码现在不起作用了。@Mike'Pomax'Kamermans如果我在其他旧代码中遇到它怎么办?“坏模式”是主观的,基于类的方法只是糖衣原型继承。因此,理解原型继承仍然很重要。