不使用原型的Javascript父子继承

不使用原型的Javascript父子继承,javascript,inheritance,constructor,prototype,Javascript,Inheritance,Constructor,Prototype,我对JavaScript有点陌生。我知道应该使用prototype来实现对象之间的继承,但我尝试了以下方法,效果非常好(使用Visual Studio 2012)。我做错了什么 function Person(firstname, lastname, age, eyecolor) { this.firstname = firstname; this.lastname = lastname; this.age = age; this.eyecolor = eyeco

我对JavaScript有点陌生。我知道应该使用prototype来实现对象之间的继承,但我尝试了以下方法,效果非常好(使用Visual Studio 2012)。我做错了什么

function Person(firstname, lastname, age, eyecolor) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;

    this.name = function() {
        return this.firstname + " " + this.lastname;
    }
}

function Student(firstname, lastname, age, eyecolor, level) {
    this.level = level;
    Person.call(this, firstname, lastname, age, eyecolor);
}

var per = new Person("Abe", "Lincoln", 45, "green");

var obj = new Student("Abe", "Lincoln", 45, "green", "senior");
当我检查obj时,它有Person和Student的属性,我可以调用obj.name()得到“Abe Lincoln”。即使在VisualStudio即时窗口中,我也可以像我所期望的那样,将所有属性视为彼此的兄弟。但我没有使用原型,所以显然这是不对的

请让我直说:)


提前谢谢

要使用原型继承,您需要将
name
方法放在
Person.prototype
上:

function Person(firstname, lastname, age, eyecolor) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;
}
Person.prototype.name = function() {
    return this.firstname + " " + this.lastname;
}
然后将
学生的
.prototype
对象作为
人的一个实例:

function Student(firstname, lastname, age, eyecolor, level) {
    this.level = level;
    Person.call(this, firstname, lastname, age, eyecolor);
}

// Make the prototype object of the Student constructor inherit from the
//    prototype object of the Person constructor.
Student.prototype = Object.create(Person.prototype)
现在,您的
name
方法将在创建的所有实例中共享,而不是为每个实例重新创建

var per = new Person("Abe", "Lincoln", 45, "green");

var obj = new Student("Abe", "Lincoln", 45, "green", "senior");

你做的更像是“混合”两门课。(事实上,“类”这个词本身在谈到JavaScript时有点误导。)这是我所看到的第一个原型继承的例子,它的工作方式与我预期的一样。我原以为我读到过这样覆盖
.prototype
是不可能的。@Alnitak:不,prototype对象可以随时更改。使用构造函数创建的任何以前的对象仍将引用旧的原型对象,但更改后创建的任何对象都将使用新的原型对象。您丢失的一件事是原始原型对象上的
.constructor
属性,该属性指向构造函数函数,但如果需要,可以替换它。谢谢。所以,我对方法使用原型,但对属性不使用原型,除非我希望其中一个属性在所有实例中都是静态的,对吗?我是否也会删除“Person.call(this…)在学生内部调用?还是通过代码示例的最后一行调用?@user2079283:对。如果值是原语,您可以将其用于其他属性。当您在实际对象上设置值时,该属性将阴影化原型对象。您不想将对象和数组放在
.prototype
上,请注意原因突变将被从构造函数中创建的所有对象看到……不,不要删除
Person.call…
。它在每个
Student
对象上调用
Person
构造函数。我添加的那个只会创建一个用于继承的空对象。