不使用原型的Javascript父子继承
我对JavaScript有点陌生。我知道应该使用prototype来实现对象之间的继承,但我尝试了以下方法,效果非常好(使用Visual Studio 2012)。我做错了什么不使用原型的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
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
构造函数。我添加的那个只会创建一个用于继承的空对象。