## 标题
第一种继承,原型链继承(子类继承父类)
function Father(){
this.firstName = 'shuai'
}
var father = new Father();
Father.prototype.lastName = 'wang';
function Son(){
this.firstName = 'ming';
this.sex = 'nv';
}
Son.prototype = father;
var son = new Son()
// son继承father
console.log(son.lastName,son.firstName,son.sex);// wang ming nv
son.firstName = 'xiao';
console.log(son.firstName,father.firstName);//xiao shuai
Father.prototype.size = {
height:180,
weight:150,
face:'黄'
}
father.size.face = '白';
console.log(son.size.face,father.size.face);//白 白
纯粹的继承关系,实例是子类的实例,也是父类的实例。
父类新增原型方法/原型属性,子类都能访问的到
缺点:要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中
无法实现继承多个
来自原型对象的所有属性被所有实例共享
创建子类实例时,无法向父类构造函数传参
第二种继承
function Oys(){}
Oys.prototype.lastName = 'shuai';
Oys.prototype.fn = function(){
console.log('我是Oys中函数输出的内容');
}
function Wk(){}
Wk.prototype.sex = 'women';
// 原型的继承 原型的污染 同一个原型
Wk.prototype = Oys.prototype;
var wk = new Wk();
Wk.prototype.wife = 'dzl';
var oys = new Oys()
console.log(wk.wife,oys.wife);//dzl dzl
这种继承会造成互相污染,不推荐。
// 第三种继承 非标准的继承
function Father(name,age,sex){
// son中添加对应的属性
// this -> Son中的this
this.name = name;
this.age = age;
this.sex = sex;
}
Father.prototype.car = '4个圈';
function Son(name,age,sex){
// this.name = name;
// this -> son Father中的this已经被改成当前son
//在没有new完之前 并不清楚this指向谁 但是已经存在this1
Father.call(this,name,age);
// this ->{
// name:oys
// age:38
// sex:women
// girlFriend:美女1
// }
// Father.call() Father()
this.girlFriend = '美女1';
// 隐式返回this
}
var son = new Son('oys',38,); //
console.log(son);//{}
// 让自己实例化 拥有对应的属性 name age sex
function test(){
console.log('aaa');
}
test.call();// 在不传递参数的情况下 等同于直接执行
test();
这种继承是用call(),apply方法改变this的非标准继承方式。