自定义继承:
1.仅设置两个对象间的继承关系:
Child.__proto__=father
问题:__proto__也是内部属性,有可能被浏览器禁用
解决:API
//设置child继承father
Object.setPrototypeOf(child,father);
var hmm={
name:"Han Meimei",
age:19,
getName(){
console.log(this.name);
}
}
hmm.getName();
var father={
bal:2000,
car:'infiniti'
};
Object.setPrototypeOf(hmm,father);
console.dir(hmm);
2.批量设置多个子对象的继承关系
只要修改构造函数的Prototype对象即可
构造函数.prototype=father
var father={
bal:2000,
car:'infiniti'
};
function Student(name,age){
this.name=name;
this.age=age;
}
Student.prototype=father;
Student.prototype.getName=function(){
console.log(this.name);
}
var lilei=new Student("Li Lei",18);
var hmm=new Student("Han Meimei",18);
时机:定义完构造函数之后,立即修改原型对象!
3.两种类型间的继承:
何时使用:如果发现多个类型之间拥有相同的属性结构和方法时,就要抽象出一个父类型
如何使用:
1.定义父类型:
父类型的构造结构,集中定义相同的属性结构
父类型的原型对象,集中定义相同的方法
2.让子类型原型对象继承父类型原型对象
结果:保证子对象可调用抽象父类型原型对象中的方法
3.在子类型构造函数中借用父类型构造函数
结果:请父类型构造函数帮助和构造共有的属性结构
问题:直接调用父类型构造函数,其中的this默认指window。
解决:call->只要this不是想要的!就可用call随便替换
父类型构造.call(this,参数)
继承中先有子类型,只有子类型中有公共的属性和方法才抽象父类型
function Fly(name,speed){
this.name=name;
this.speed=speed;
}
Fly.prototype.fly=function(){
console.log(`${this.name}的飞行速度${this.speed}`);
}
function Plane(name,speed,score){
Fly.call(this,name,speed);
this.score=score;
}
Plane.prototype.getScore=function(){
console.log(`${this.name}得${this.score}分`);
}
Object.setPrototypeOf(Plane.prototype,Fly.prototype);
var f16=new Plane("f16",1000,20);
console.dir(f16);
f16.