下面是常用的js类继承的方式,我们继承一下上篇文章中的Person类:
function Person(name, age, email){ this.name = name; this.age = age; this._email = email; } function _Person_show_me(){ alert('我叫' + this.name + ',我' + this.age + '岁了,我的email是' + this._email); } Person.prototype.show_me = _Person_show_me; function Student(name, age, email, score){ Person.call(this, name, age, email); this.score = score; } function _Student_show_score(){ alert("我的分数是:" + this.score); } Student.prototype = new Person(); Student.prototype.show_score = _Student_show_score; var he = new Student('小何', 28, 'baijun.he@163.com', 80); he.show_me(); he.show_score();
- 使用了js的call()方法调用父类的构造函数。第一个参数是this,当实例化Student时,这个this就表示he这个对象。后面的参数就是调用的函数Person的参数。
- Student.prototype = new Person();通过这个语句把Person类的属性和方法传递给Student类。这里只传递了方法,属性我们通过上面的call方法定义了。
- 为什么在 new Person();中没有传递参数呢?这是原型链的标准做法。要确保构造函数没有任何参数。我们通过call方法实现参数的赋值。
- Student.prototype.show_score = _Student_show_score;必须在 Student.prototype = new Person();后面调用,因为执行 Student.prototype = new Person();时Student的prototype属性被替换成了新的对象,以前的属性和方法会被删除。