继承
父类与子类
子类是父类的一个子集
比如:人类和医生类,医生类是人类的子集;人类是父类,医生类是子集
父类与子类在特性(属性和方法)上有什么关系
方法:子类对象可以调用父类原型上的方法
//父类:人
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.breathe = function(){
console.log(this.name + " is breathing");
}
//子类:医生
function Doctor(name,age,title){
this.name = name;
this.age = age;
this.title = title;
}
//医生作为人的子类,可以调用人原型上的方法
//实现原型的继承
Doctor.prototype.__proto__ = Person.prototype;
var d1 = new Doctor("zhangsan",20,"doctor");
d1.breathe();//正常调用
Doctor.prototype.__proto__ = Person.prototype;
对象访问自己的原型用__proto__
任何对象都有原型。访问方式都是对象.__proto__
Doctor.prototype时医生类的原型对象
可以通过__proto__的方式访问原型对象的原型
把Person类的原型赋值给医生类原型的原型,产生以下效果
1.人类原型上存在方法breathe,即Person.prototype.breathe()
2.赋值后医生类原型的原型就是人类原型,所以存在方法Doctor.prototype.__proto__.breathe()
3.根据规则,存在Doctor.prototype.__proto__.breathe()就一定存在Doctor.prototype.breathe()
4.Doctor实例化出的对象d1存在
d1.__proto__ == Doctor.prototype //true
5.根据规则存在d1.__proto__.breathe()就一定存在d1.breathe()
综上,通过Doctor.prototype.__proto__ = Person.prototype;可以实现原型的继承,子类对象可以调用父类原型的方法。
Object类
object类的原型上封装类很多基本的方法,如toString等
console.log(object.prototype);
在声明类是,所有类的圆心都自动继承object的原型
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.say = function () {
console.log(this.name + ":" + this.age);
}
var p = new Person("zhangsan", 18);
console.log(p.toString());//正常调用
Person类在声明时,原型对象自动继承了object的原型
即Person类自动成为了object的子类
p作为子类对象,可以调用父类原型上的方法,即p.toString()
声明Prog类,继承Person类的原型
function Prog(name,age) { this.name = name; this.age = age; } Person.prototype.work = function () { console.log("在工作"); } 程序员原型继承人原型 Prog.prototype.__proto__ = Person.prototype;
Prog类在声明时,原型本来也是继承object的原型
但是人为的篡改了继承方式,Prog原型继承了Person的原型
function JsPro(name,age){ this.name = name; this.age = age; } JsPro.prototype.__proto__ = Prog.prototype; var j1= new JsPro("a",20); console.log(j1.toString());//正常执行
“孙子类”调用“爷爷类”的方法
类之间通过继承,让原型形成了一条“链子”,成为原型链
注:Object原型的原型指向谁(即Object继承谁)?
答:null(原型链的顶端)