一. 两个当个对象之间的继承
Object.setPrototypeOf(子对象,父对象)
var father={balance:10000000000,car:"=B="};
function Student(sname,sage){//this-->刚创建的空对象
this.sname=sname;
this.sage=sage;
}
var lilei=new Student("Li Lei",18);
var hmm=new Student("Han Meimei",19);
/*仅修改一个子对象的父对象*/
//hmm.__proto__=father;
Object.setPrototypeOf(hmm,father);
console.log(hmm.balance); //1000.....
二. 修改构造函数的原型对象------构造函数.Prototype=父对象
替换构造函数的原型对象(prototype),为新父对象:
结果:将来再创建的子对象,所有新创建的子对象都继承新父对象
时机:在刚刚定义完构造函数后,立刻修改!
在修改原prototype对象和创建新子对象之前
步骤:1. 构造函数.prototype=新父对象
2. 构造函数.prototype.constructor=构造函数对象
该方法必须在创建对象之前才有效
var father={balance:10000000000,car:"=B="};
function Student(sname,sage){//this-->刚创建的空对象
this.sname=sname;
this.sage=sage;
}//prototype-->Student.prototype
Student.prototype=father;
Student.prototype.constructor=Student;
//prototype-->father
//凡是子对象共有的属性值和方法,都要放在构造函数的原型中
Student.prototype.intrSelf=function(){
console.log("I'm "+this.sname+",I'm "+this.sage);
}//prototype.intrSelf
//father.intrSelf
var lilei=new Student("Li Lei",18);
var hmm=new Student("Han Meimei",19);
/*仅修改一个子对象的父对象*/
//hmm.__proto__=father;
//Object.setPrototypeOf(hmm,father);
console.log(hmm.balance); //1000.....
console.log(lilei.balance);//1000.....
lilei.intrSelf();
hmm.intrSelf();
var son=Object.create(父对象,
{
扩展属性名1:{configurable:true
},
扩展属性名2:{...}});
var father={balance:10000000000,car:"=B="};
var son=Object.create(father,{
favorite:{value:"坑爹"/*,writable:true*/}
});
console.log(son.balance);
console.log(son.favorite);
console.log(son.hasOwnProperty("favorite"));//true
son.favorite="飙车";
console.log(son.favorite);
四. 既继承结构,又继承原型:——推荐的继承方式
何时使用:两种类型间的继承
1. 子类型构造函数开始位置,借用父类型构造函数:
父类型构造函数.call(this,参数列表)
父类型构造函数.apply(this,[参数列表])
强调:仅完成第一步,只是借用构造函数中的语句而已
没有实现任何对象间的继承
function sub(){
Super.call(this, 参数....);
sub的扩展属性
}
2. 定义构造函数后,设置子类型构造函数的prototype继承父类型的prototype:
Object.setPrototypeOf(sub.prototype, parent.prototype)
Apply 示例:
1
/*定义所有飞行物类型的构造函数*/
function Flyer(fname,speed){
this.fname=fname; this.speed=speed;
}
Flyer.prototype.fly=function(){//所有飞行物都能飞行
console.log(this.fname+" 以 "+this.speed+" 时速飞行");
}
var bird=new Flyer("小麻雀",60);
bird.fly();
/*定义飞机类型的构造函数:名称,速度,载客数*/
function Plane(fname,speed,capacity){
Flyer.call(this,fname,speed);//——借用构造函数
this.capacity=capacity;
}//Plane.prototype 继承 Flyer.prototype
Object.setPrototypeOf(Plane.prototype,Flyer.prototype);
Plane.prototype.fly=function(){
console.log(this.fname+" 搭载 "+
this.capacity+" 名乘客以 "+
this.speed+" 时速飞行");
}
var A380=new Plane("A380",1000,555);
A380.fly();//?