经常debug的时候看见_proto_,constructor,但是一直没有去理解是什么东西,今天来研究一下。
废话不说,上代码。
function Person(name) {
this.name=name;
this.getName=function () {
console.log("getPersonName")
return this.name;
}
}
function Staff() {
}
function Teacher() {
}
var staff=new Staff();
//使User继承Person
Teacher.prototype=staff;
var teacher=new Teacher();
//使Staff继承Person
var person=new Person();
Staff.prototype=person;
new Staff().getName();
console.log(teacher.__proto__==Teacher.prototype)
console.log(teacher.constructor==Person);
console.log(teacher.__proto__.__proto__==Staff.prototype)
console.log(teacher.__proto__.__proto__==person)
console.log(teacher.__proto__.__proto__.__proto__==Person.prototype)
输出结果:
可见prototype是一个对象,当js使用new Teacher的时候访问constructor,也就是Teacher函数,但是由于使用了prototype,所以Teacher的construcor变成了Staff函数,然后变成了Person函数,使用new出来的对象保留了一个_proto_属性,也就是Teacher.prototype,由输出结果很容易看到_proto_下去就会到达最终的继承的对象Person,这样就实现了js的继承,多继承可以用call来实现,Teacher的constructor会是原型链根位置的函数即Person。