我正在学习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()
但超级在这里不起作用。
请告诉我,我所做的是如何实现JS中的继承或者我做错了什么。
PS: 我尝试使用超级调用来像Java一样问候,但它给了我一个错误。这是否意味着Employee类没有扩展Person类?
答案 0 :(得分:1)
Employee.prototype = Object.create(Person)
已将Employee.prototype
分配给Person
功能。
函数具有name
属性,这就是为什么它记录了该特定函数的名称:Person
。
Employee
实例有三个可以查找属性的池:
首先是具有3个属性的Employee实例:
第二个是Employee原型(如果在Employee实例上找不到prop,js看起来在这里)有1个方法:
第三个是人原型(如果在以前的对象上找不到prop,js看起来在这里)有1个方法:
由于greeting
同时位于Employee.prototype
和Person.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的一个实例)