Javascript中的继承 - 来自子方法的父方法调用

时间:2017-07-29 08:27:29

标签: javascript inheritance

我正在学习Javascript中的原型继承,我尝试编写一个从子方法原型中调用父方法的示例。但是,我没有得到我预期的结果。

Person.js

function Person(name, age) {
    this.name = name;
    this.age = age;
}


Person.prototype.greeting = function() {
    console.log("Hello, My name is " + this.name + " and I am " + this.age + " years old.")
}

module.exports = Person;

Employee.js

var Person = require('./Person');

var Employee = function(name, age, salary) {
    Person.call(this, name, age);
    this.salary = salary;
}

Employee.prototype = Object.create(Person.prototype);

Employee.prototype.greeting = function() {
    Person.prototype.greeting.call(this);
    console.log("My salary is " + this.salary)
}

module.exports = Employee;

Test.js

var Person = require('./Person');
var Employee = require('./Employee');

var p = new Person("Rob", 24);

p.greeting();

var e = new Employee("Jim", 25, 1200000);

e.greeting();

基本上我所拥有的是Person类,其nameage以及greeting方法附加到其原型上,用于打印一些数据。 Employee类扩展了Person,并具有其他属性salary。它还通过打印薪水覆盖greeting方法。但是,在打印salary之前,它会调用super class'问候语方法,然后打印salary

我的预期输出是:

Hello, My name is Rob and I am 24 years old.
Hello, My name is Jim and I am 25 years old.
My salary is 1200000

但实际输出为:

Hello, My name is Rob and I am 24 years old.
Hello, My name is Person and I am 25 years old.
My salary is 1200000

我知道 call()方法需要与上下文this一起传递参数。而且this (Person)的名称被替换为名称,它告诉我们这些类不是纯粹继承的,因为我在调用里面的方法。我应该可以在里面使用super.methodName()但超级在这里不起作用。

请告诉我,我所做的是如何实现JS中的继承或者我做错了什么。

PS: 我尝试使用超级调用来像Java一样问候,但它给了我一个错误。这是否意味着Employee类没有扩展Person类?

1 个答案:

答案 0 :(得分:1)

Employee.prototype = Object.create(Person)

已将Employee.prototype分配给Person功能。 函数具有name属性,这就是为什么它记录了该特定函数的名称:Person

Employee实例有三个可以查找属性的池:

首先是具有3个属性的Employee实例:

  1. 名称
  2. 年龄
  3. 薪水
  4. 第二个是Employee原型(如果在Employee实例上找不到prop,js看起来在这里)有1个方法:

    1. 问候
    2. 第三个是人原型(如果在以前的对象上找不到prop,js看起来在这里)有1个方法:

      1. 问候
      2. 由于greeting同时位于Employee.prototypePerson.prototype,您无法从Employee实例访问Person.prototype.greeting - 它始终会被{{1}阻止在链条中更接近。这就是为什么:

        Employee.prototype.greeting

        你必须直接调用Employee.prototype.greeting = function() { Person.prototype.greeting.call(this); console.log("My salary is " + this.salary) } (函数内的Person.prototype.greeting是Employee的一个实例)