【发布时间】:2017-07-29 08:27:28
【问题描述】:
我正在学习 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 类,它具有name 和age 以及一个附加到其原型的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(),但是 super 在这里不起作用。
请告诉我我所做的是如何实现 JS 中的继承,或者我做错了什么。
PS:我尝试像在 Java 中那样使用 super call 来问候,但它给了我一个错误。这是否意味着 Employee 类没有扩展 Person 类?
【问题讨论】:
-
重命名
Person中的属性this.name,与Function.name属性冲突。