方法在JavaScript中执行继承时未被传递

方法在JavaScript中执行继承时未被传递,javascript,Javascript,我有一个函数构造函数是这样定义的: var Person = function (name, yearOfBirth, job) { this.name = name; this.yearOfBirth = yearOfBirth; this.job = job; } Person.prototype.calculateAge = function () { conso

我有一个函数构造函数是这样定义的:

var Person = function (name, yearOfBirth, job) {
            this.name = name;
            this.yearOfBirth = yearOfBirth;
            this.job = job;
        }
        Person.prototype.calculateAge = function () {
            console.log(2016 - this.yearOfBirth);
        };
var Teacher = function (name, yearOfBirth, subject) {
            Person.call(this, name, yearOfBirth, "teacher");
            this.subject = subject;
        }
var roySir = new Teacher("Roy", 1960, "English");
现在我还有另一个函数构造函数,叫做Teacher,我是这样定义的:

var Person = function (name, yearOfBirth, job) {
            this.name = name;
            this.yearOfBirth = yearOfBirth;
            this.job = job;
        }
        Person.prototype.calculateAge = function () {
            console.log(2016 - this.yearOfBirth);
        };
var Teacher = function (name, yearOfBirth, subject) {
            Person.call(this, name, yearOfBirth, "teacher");
            this.subject = subject;
        }
var roySir = new Teacher("Roy", 1960, "English");
现在,我通过以下方式创建一个名为roySir的新对象:

var Person = function (name, yearOfBirth, job) {
            this.name = name;
            this.yearOfBirth = yearOfBirth;
            this.job = job;
        }
        Person.prototype.calculateAge = function () {
            console.log(2016 - this.yearOfBirth);
        };
var Teacher = function (name, yearOfBirth, subject) {
            Person.call(this, name, yearOfBirth, "teacher");
            this.subject = subject;
        }
var roySir = new Teacher("Roy", 1960, "English");
然而当我试着去做的时候 roySir.calculateAge()我说这个时出错了

“roySir.calculateAge不是一个函数”

为什么calculateAge函数不在这里继承

我的另一个问题是当我检查时:

roySir.hasOwnProperty("name") // true
为什么这里是真的?名称不是父类的属性而不是自己的属性吗


您应该确保
教师的原型继承自
人的原型。简单地调用
ing
Person
Teacher
不会让
Teacher
继承
Person
的原型方法:

var Person=函数(姓名、出生年份、职务){
this.name=名称;
this.yearOfBirth=出生年份;
这个工作=工作;
}
Person.prototype.calculateAge=函数(){
console.log(2016年-今年出生);
};
var Teacher=函数(名称、出生年份、主题){
人称(这个,名字,出生年份,“老师”);
this.subject=主语;
}
Teacher.prototype=Object.create(Person.prototype);
var roySir=新教师(“Roy”,1960年,“英语”);

roySir.calculateAge()
您应该确保
教师的原型继承自
人的原型。简单地调用
ing
Person
Teacher
不会让
Teacher
继承
Person
的原型方法:

var Person=函数(姓名、出生年份、职务){
this.name=名称;
this.yearOfBirth=出生年份;
这个工作=工作;
}
Person.prototype.calculateAge=函数(){
console.log(2016年-今年出生);
};
var Teacher=函数(名称、出生年份、主题){
人称(这个,名字,出生年份,“老师”);
this.subject=主语;
}
Teacher.prototype=Object.create(Person.prototype);
var roySir=新教师(“Roy”,1960年,“英语”);

roySir.calculateAge()
您所处的JS环境是否支持新的ES6
——这要容易得多。。只是跟着教程走。。但它并没有详细说明为什么会这样做,但它不起作用?所以教程有缺陷没有。。它在教程中起作用。。因为他们没有原型方法。。我只是把它作为一个学习练习添加了进来。您是否处于支持新ES6
类的JS环境中?这样做要容易得多。。只是跟着教程走。。但它并没有详细说明为什么会这样做,但它不起作用?所以教程有缺陷没有。。它在教程中起作用。。因为他们没有原型方法。。我只是把它添加到自己的学习练习中..为什么要使用Teacher.prototype=Object.create(Person.prototype)。。我可以说Teacher.prototype=Person.prototype?。。它们是一样的吗?请参见编辑-如果您这样做,将突变为
Teacher.prototype
将不必要地更改
Person.prototype
以及-您不会使用继承,您只会覆盖另一个prototype对象。是的,我正在阅读编辑。非常感谢你把这一点讲清楚。你能回答我关于他自己的财产的另一个问题吗…?:)为什么要使用Teacher.prototype=Object.create(Person.prototype)。。我可以说Teacher.prototype=Person.prototype?。。它们是一样的吗?请参见编辑-如果您这样做,将突变为
Teacher.prototype
将不必要地更改
Person.prototype
以及-您不会使用继承,您只会覆盖另一个prototype对象。是的,我正在阅读编辑。非常感谢你把这一点讲清楚。你能回答我关于他自己的财产的另一个问题吗…?:)